首页 > 解决方案 > C++ 向量插入和迭代器混淆

问题描述

int main(){
    vector<int> veclist;
    veclist.push_back(90);
    veclist.push_back(80);
    veclist.push_back(70);

    vector<int>::iterator it;
    it=veclist.begin();
    veclist.insert(it,20);
    cout << *it << endl;  // prints 20 
    it++;
    veclist.insert(it,99);
    cout << *it <<endl;  // line abc : prints 0 
}

嗨,我正在使用 C++ 中的向量和迭代器。在上面的代码中,为什么 "line abc" 打印 0。它不应该打印 99 吗?当我使用 for 循环打印所有矢量元素时,也会打印 99 但为什么 line abc 不这样做?我正在取消对迭代器 *it 的引用,并且我希望它能够保存元素 99。

标签: c++vectoriteratordereference

解决方案


插入向量时,所有先前的迭代器都无效。之后的一切veclist.insert(it,20)都是未定义的行为。

为了更准确地了解幕后发生的事情,第一次打印工作而第二次打印失败的原因是分配的std::vector容量。大多数实现只分配2^N 个内存块。

因此,初始向量的容量为 4。当您将大小从 3 增加到 4 时,所有先前的迭代器恰好保持有效。但是,当大小从 4 增长到 8 时,内存被复制到一个新区域,因此您正在访问已删除的内存。

为了解决这个问题,您可以简单地使用std::vector::insert, 作为指向插入元素的有效迭代器的结果:

例如

it = veclist.insert(it,20);

推荐阅读