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

标签 c++ vector stl

我编写了一段代码来从 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 中没有足够的空间,它必须分配新内存,并从旧内存中复制数据。迭代器 a 基本上指向 vector 包装的内存,因此如果 vector 重新分配内存,迭代器(“指针”)不再指向分配的内存,而是指向旧的空闲内存。

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

关于c++ - 为什么 Vector 中的 Erase 和 Insert 函数会使迭代器失效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39435683/

相关文章:

c++ - 无法接收 HTTP 响应正文 C++

c++ - 在 vector 中推送结构会覆盖时间分量

c++ - 在 RAD Studio 2007 的 Watch 中评估表达式

c++ - 可以仅使用 std::sort() 将零移动到数组的末尾吗?

c++ - 根据字符串大小对字符串 vector 进行排序

c++ - 容器迭代器和容器操作

c++ - 可以更改模板参数吗?

c++ - C++ 对象上的列表

c++ - Valarray 和自定义分配器

c++ - 高效的循环列表