C++ vector 插入和迭代器混淆

标签 c++ vector iterator dereference

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++ 中的 vector 和迭代器。在上面的代码中,为什么“line abc”打印0。它不应该打印99吗?当我使用 for 循环打印所有 vector 元素时,也会打印 99 但为什么 abc 行不这样做?我取消引用迭代器 *it,并且我期望它保存元素 99。

最佳答案

在 vector 中插入时,所有先前的迭代器都会失效。 veclist.insert(it,20) 之后的所有内容都是未定义的行为。

为了更准确地了解幕后发生的情况,第一个打印工作而第二个打印不工作的原因是由于分配的 std::vector 容量。大多数实现仅分配 2^N 内存 block 。

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

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

例如

it = veclist.insert(it,20);

关于C++ vector 插入和迭代器混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62164212/

相关文章:

c++ - 使用Qt5解析以括号 `[`开头的JSON

c++ - OpenCV 2.4.9读取空白图像

r - R 中的错​​误 : nonconformable arguments. 不正确?

c++ - 如何构造一个带有成员函数的双端队列类? C++

c++ - 试图通过重载打印对象的 vector ?

c++ - 嵌套 c++11 范围循环以查找组合

c++ - 如何在 R 中将 C++ ODE 求解器与 Rcpp 一起使用?

c++ - 为什么 cin.clear() 会修复由 cin 错误输入引起的无限循环?

r - 与列表名称相同的字符向量

JavaScript - myArray.forEach 与 for 循环的细微差别