#include <iostream>
#include <string>
#include <vector>
#include<algorithm>
using namespace std;
/*
push_back(ele); //尾部插入元素ele
pop_back(); //删除最后一个元素
insert (const iterator pos, ele);//迭代器指向位置pos插入元素ele
insert(const_iterator pos, int count,ele)://迭代器指向位置pos插入count个元素ele
erase (const_iterator pos); //删除迭代器指向的元素
erase (const_iterator start, const_iterator end);//删除迭代器从start到end之问的元素
clear();//删除容器中所有元素
*/
void printVector03(vector<int>& v)
{
if (v.empty())
{
cout << "容器为空" << endl;
}
else
{
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
}
void test04()
{
vector<int> v1;
for (size_t i = 0; i < 9; i++)
{
v1.push_back(i);
}
printVector03(v1);
v1.pop_back();
printVector03(v1);
vector<int>::iterator it = v1.begin();
v1.insert(it + 3, -1);
printVector03(v1);
v1.insert(it + 2, 3, -2);
printVector03(v1);
it = v1.begin();//更新迭代器
//插入操后迭代器失效
//原因
//如果插入导致容器的大小超过了当前容器的容量,那么 vector 就需要重新分配内存 这时原来的迭代器指向的区域就会失效
v1.erase(it + 2);
printVector03(v1);
v1.erase(it + 2, v1.end());//[beg,end)
printVector03(v1);
v1.clear();
printVector03(v1);
}
int main()
{
test04();
return 0;
}
以下是chatgpt的回答
在C++中,vector
是一个动态数组容器,它会自动调整存储空间大小以适应元素的添加和删除。当你执行 vector
的 insert
操作时,如果插入导致容器的大小超过了当前容器的容量,那么 vector
就需要重新分配内存,并将所有元素复制到新的内存区域,然后在新的内存区域上进行插入操作。这个重新分配内存和复制元素的过程可能导致迭代器失效,因为迭代器通常是与特定内存位置相关联的。
以下是为什么 insert
操作可能导致迭代器失效的一些原因:
-
内存重新分配:
vector
需要在插入新元素时可能会重新分配内存,这意味着现有的元素将被复制到新的内存位置。如果你持有旧的迭代器,它们将指向旧的内存位置,这些位置上的元素可能已经被移动到新的位置,因此迭代器会失效。 -
容量超出:如果插入操作导致
vector
的大小超过当前容器的容量,那么vector
可能会分配更大的内存块,并将现有元素复制到新的内存中。这也会导致迭代器失效,因为它们无法自动更新以指向新的内存位置。 -
元素移动:
vector
中的元素是紧密排列的,插入元素可能需要将后面的元素向后移动以腾出空间。这些元素的移动会影响迭代器的有效性,因为它们仍然指向原来的位置。
为了避免迭代器失效,你可以考虑以下几种方法:
-
使用索引而不是迭代器来访问元素,因为索引不会失效。
-
在插入操作之前保存好迭代器,然后在插入后更新迭代器以指向正确的位置。
-
使用
reserve
函数来预分配足够的内存空间,以避免在插入操作时发生内存重新分配。