c++ - 插入新元素时结束迭代器是否会更新?
问题描述
我无法弄清楚为什么在运行以下简单程序时出现错误
#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
and v.begin()
,it1
它it2
没有任何区别)。
谢谢你。
解决方案
it1 == it2
评估为 false ,因为在 this 之后auto it_tmp = v.insert(v.end(), 6);
,结束迭代器发生了变化。
std::vector::insert
在给定的迭代器之前插入。插入点之前的所有内容都保持有效。失效后的一切。it1
这里无效:
标准::向量::插入
如果新的 size() 大于旧的 capacity(),则导致重新分配。如果新的 size() 大于 capacity(),则所有迭代器和引用都无效。否则,只有插入点之前的迭代器和引用保持有效。过去的迭代器也无效。
推荐阅读
- vue.js - Teamcity 上的 Jest 单元测试
- c# - 如何捕获和处理 Task.Factory 内部发生的未处理异常
- swift - 如何修复 iOS 应用程序中的内存泄漏?
- swiftui - Swiftui 隐藏披露箭头
- mongodb - mongoDB updateMany 基于嵌套数组条件
- python - 错误:设置迭代失败:未识别的错误,请检查门户/计算中的日志
- .net - 将文件上传到与 IIS 托管的 ASP.NET 应用程序不同的计算机中的共享文件夹会出现错误,因为对路径“...”的访问被拒绝
- vuejs2 - Vuetify / vuejs 链接在项目列表中不起作用
- scala - 为 Scala 类创建一个空构造函数
- datatables - 如何添加 X 以清除输入字段