为什么Vector中的Erase和Insert函数使迭代器失效?



我写了一段代码从vector中擦除元素,但是在for循环中使用迭代器擦除后,我的程序崩溃了。甚至通过迭代器向vector中插入元素也会产生相同的结果。下面是代码片段:

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容器中擦除元素或插入元素后使迭代器失效的原因。

请解释一下?

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

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

最新更新