为什么Vector中的擦除和插入函数使迭代器无效?

时间:2016-09-11 11:40:08

标签: 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_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);
    }
}

我只是想了解在Vector容器中删除元素或插入元素后使迭代器失效的原因。

请问有什么解释吗?

1 个答案:

答案 0 :(得分:4)

向量动态分配内存。如果向量中没有足够的空间,则必须分配新内存,并复制旧内存中的数据。迭代器基本上指向向量包含的内存,因此如果向量重新分配内存,迭代器(&#34;指针&#34;)不再指向已分配的内存,而是指向旧的自由内存。

但那只是一个的原因。另一个是矢量模拟一个数组,就像一个数组一样,矢量中的元素是连续存储的。如果在向量的中间插入或删除元素,则必须调整插入/移除元素之后的所有数据并将其移动到新位置以使元素保持连续。再次,迭代器&#34;指向&#34;移动的元素将不再指向正确的位置。

相关问题