C++ 为什么向量中的擦除和插入函数使迭代器无效?

C++ 为什么向量中的擦除和插入函数使迭代器无效?,c++,vector,stl,C++,Vector,Stl,我编写了一个代码来删除向量中的一个元素,但是在for循环中使用迭代器删除之后,我的程序崩溃了。即使通过迭代器在向量中插入一个元素,结果也是一样的。以下是代码片段: vector<int>v1; v1.reserve(8); v1.push_back(10); v1.push_back(8); v1.push_back(12); v1.push_back(3); v1.push_back(7); v1.push_back(5); v1.push_back(17); v1.push_ba

我编写了一个代码来删除向量中的一个元素,但是在for循环中使用迭代器删除之后,我的程序崩溃了。即使通过迭代器在向量中插入一个元素,结果也是一样的。以下是代码片段:

vector<int>v1;
v1.reserve(8);
v1.push_back(10);
v1.push_back(8);
v1.push_back(12);
v1.push_back(3);
v1.push_back(7);
v1.push_back(5);
v1.push_back(17);
v1.push_back(1);
int x=6;
std::vector<int>::iterator get_it;
get_it = v1.begin();
for(;get_it!= v1.end();get_it++)
{
    if(*get_it < x)
    {
        v1.insert(get_it, 6);
    }
}
vectorv1;
v1.储备(8);
v1.推回(10);
v1.推回(8);
v1.推回(12);
v1.推回(3);
v1.推回(7);
v1.推回(5);
v1.推回(17);
v1.推回(1);
int x=6;
std::vector::迭代器获取它;
get_it=v1.begin();
for(;get_it!=v1.end();get_it++)
{
如果(*获取它
我只是想理解在向量容器中删除元素或插入元素后使迭代器无效的原因


有什么解释吗?

向量动态分配内存。如果向量中没有足够的空间,它必须分配新内存,并从旧内存复制数据。迭代器a基本上指向向量包装的内存,因此如果向量重新分配内存,迭代器(“指针”)不再指向分配的内存,而是指向旧的空闲内存


但这只是一个原因。另一种是向量模拟数组,与数组一样,向量中的元素是连续存储的。如果插入或移除向量中间的元素,则插入/移除元素之后的所有数据都必须被调整并移动到新的位置,以保持元素连续。同样,指向移动元素的迭代器将不再指向正确的位置。

向量动态分配内存。如果向量中没有足够的空间,它必须分配新内存,并从旧内存复制数据。迭代器a基本上指向向量包装的内存,因此如果向量重新分配内存,迭代器(“指针”)不再指向分配的内存,而是指向旧的空闲内存


但这只是一个原因。另一种是向量模拟数组,与数组一样,向量中的元素是连续存储的。如果插入或移除向量中间的元素,则插入/移除元素之后的所有数据都必须被调整并移动到新的位置,以保持元素连续。同样,迭代器“指向”移动的元素将不再指向正确的位置。

请注意,
erase
insert
都返回可用于继续迭代的有效迭代器。请注意,
erase
insert
都返回可用于继续迭代的有效迭代器。