首页 > 解决方案 > 插入新元素时结束迭代器是否会更新?

问题描述

我无法弄清楚为什么在运行以下简单程序时出现错误

#include <iostream>
#include <vector>

int main(int argc, char** argv) {
    std::vector<int> v{ 1,2,3,4,5 };
    std::vector<int>::iterator it1 = v.end();
    auto it_tmp = v.insert(v.end(), 6);
    std::vector<int>::iterator it2 = v.end();

    std::cout << (it1 == it2) << std::endl;

    return 0;
}

迭代器it1it2不兼容,所以我想知道可能是什么问题。如果迭代器属于不同的容器,则迭代器是不兼容的,然后我会假设在我的情况下,两者中的一个会失效或类似的情况(我也尝试对两者进行更改v.endand v.begin()it1it2没有任何区别)。

谢谢你。

标签: c++stliterator

解决方案


it1 == it2评估为 false ,因为在 this 之后auto it_tmp = v.insert(v.end(), 6);,结束迭代器发生了变化。

std::vector::insert在给定的迭代器之前插入。插入点之前的所有内容都保持有效。失效后的一切。it1这里无效:

标准::向量::插入

如果新的 size() 大于旧的 capacity(),则导致重新分配。如果新的 size() 大于 capacity(),则所有迭代器和引用都无效。否则,只有插入点之前的迭代器和引用保持有效。过去的迭代器也无效。


推荐阅读