插入新元素时,结束迭代器是不是会更新? [复制]

Posted

技术标签:

【中文标题】插入新元素时,结束迭代器是不是会更新? [复制]【英文标题】:Does end iterator get update when inserting a new element? [duplicate]插入新元素时,结束迭代器是否会更新? [复制] 【发布时间】:2019-05-05 20:32:20 【问题描述】:

我不知道为什么在运行以下简单程序时会出错

#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.end 更改为 v.begin() 用于 it1 和 @987654327 @,没有任何区别)。

谢谢。

【问题讨论】:

【参考方案1】:

it1 == it2 的计算结果为 false,因为在此 auto it_tmp = v.insert(v.end(), 6); 之后,结束迭代器发生了变化。

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

std::vector::insert

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

【讨论】:

那么旧的会怎样? @user8469759 将其添加到答案中 @user8469759 过去的迭代器也失效了 我刚试过v.reserve(1000),还是不行。 @user8469759 即使您有足够的空间并且没有分配任何内容,插入向量总是会使插入点之后的每个迭代器无效

以上是关于插入新元素时,结束迭代器是不是会更新? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C++容器类插入和删除时迭代器的失效情况总结

Python3迭代器与生成器

Python3 迭代器与生成器

可以重新插入元素“重新验证”迭代器吗?

C++ STL与迭代器

迭代器知识整理