插入新元素时,结束迭代器是不是会更新? [复制]
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;
迭代器 it1
和 it2
不兼容,所以我想知道可能是什么问题。如果迭代器属于不同的容器,则迭代器是不兼容的,然后我会假设在我的情况下,两者中的一个会失效或类似的情况(我还尝试将 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 即使您有足够的空间并且没有分配任何内容,插入向量总是会使插入点之后的每个迭代器无效以上是关于插入新元素时,结束迭代器是不是会更新? [复制]的主要内容,如果未能解决你的问题,请参考以下文章