vector

1. 特点:

(1) 一个动态分配的数组(当数组空间内存不足时,都会执行: 分配新空间-复制元素-释放原空间);

(2) 当删除元素时,不会释放限制的空间,所以向量容器的容量(capacity)大于向量容器的大小(size);

(3) 对于删除或插入操作,执行效率不高,越靠后插入或删除执行效率越高;

(4) 高效的随机访问的容器。

(5) 可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢。 &arr[n] = &arr[0] + n * sizeof(type)

(6)  插入:可能引发内存重新分配(迭代器全部失效)

(7)  删除:删除点之后的迭代器全部失效

 

2. 初始化:

// 数组
vector<int> dp; // dp为空,size=0 capacity=0
vector<int> dt = {0, 1, 2, 3, 4, 5, 6, 7, 8};
// dt的拷贝
vector<int> vec(dt);
vector<int> vec2(dt.begin() + 2, 5);
vector<int> lst(7); // 初始化7个元素,每个元素默认初始化0
vector<int> lst(7, 2); // 初始化7个元素,每个元素默认初始化2
vector<int> dp(len, value); // 初始化len长度个元素,每个元素均初始化成value

// 二维数组 10行5列, 并且默认值为1
vector<vector<int>> arr(10, vector<int>(5, 1));
// m行n列 初始值为0
vector<vector<int>> arr1(m, vector<int>(n, 0));
vector<vector<int>> arr2 = {
{1, 2, 3, 4},
{1, 2, 3, 4},
{1, 2, 3, 4}
};

 

3. 基本操作

v.capacity(); //容器容量

v.size(); //容器大小

v.at(int idx); //用法和[]运算符相同

v.push_back(); //尾部插入

v.pop_back(); //尾部删除

v.front(); //获取头部元素

v.back(); //获取尾部元素

v.begin(); //头元素的迭代器

v.end(); //尾部元素的迭代器

v.insert(pos,elem); //pos是vector的插入元素的位置

v.insert(pos, n, elem) //在位置pos上插入n个元素elem

v.insert(pos, begin, end);

v.erase(pos); //移除pos位置上的元素,返回下一个数据的位置

v.erase(begin, end); //移除[begin, end)区间的数据,返回下一个元素的位置

reverse(pos1, pos2); //将vector中的pos1~pos2的元素逆序存储

4. 示例:

a. 删除元素

    void Example()
    {
        // erase: 返回迭代器指向被删除元素的下一个元素
        // insert: 返回迭代器指向插入的元素。
        vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 8, 10};
        for (auto it = vec.begin(); it != vec.end(); ) {
            if (*it == 8) {
                vec.erase(it); // 等同于 it = vec.erase(it); 删除之后,后面的元素会往前挪动一位,所以原来的迭代器实际上已经指向了下一个元素。
            } else {
                it++;
            }
        }
    }

 

posted on 2022-03-17 21:05  蜀山菜鸟  阅读(39)  评论(0)    收藏  举报