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++; } } }
浙公网安备 33010602011771号