c++ - std::vector 距离函数怎么能给出比 .size() 更高的值?
问题描述
我有以下代码,其中myFields
是一个 std::set 对,而 currentSet 是一个 std::vector 对,它有一个非常奇怪的行为:在条件为真的迭代之后,currentSet
我期望的大小会增加从 1 到 2,但非常奇怪的是,for 循环中与当前迭代器的距离并没有像我预期的那样从 1 到 2,而是突然到 6。这导致我的代码在下一次迭代后崩溃,因为有向量中的元素不超过 2 个,因此它将尝试读取未分配的内存。
vector<pair<int,int>> currentSet;
currentSet.push_back( *(myFields.begin()) );
myFields.erase( myFields.begin() );
for ( auto iterator=currentSet.begin(); iterator != currentSet.end(); ++iterator ) {
set<pair<int,int>>::iterator topright = myFields.find( pair<int,int>( i, j+1 ) );
if ( topright != myFields.end() ) {
cout << "size " << currentSet.size() << endl; // gives 1
cout << "dist to end " << distance(iterator, currentSet.end()) << endl; // gives 1
UniqueInsertion(currentSet, *topright, myFields );
cout << "size " << currentSet.size() << endl; // gives 2
cout << "dist to end " << distance(iterator, currentSet.end()) << endl; // gives 6!?
}
}
UniqueInsertion
以下函数在哪里:
void UniqueInsertion(vector<pair<int,int>> &vect, const pair<int,int> &elem, set<pair<int,int>> &fields) {
if(find(vect.begin(), vect.end(), elem) == vect.end()) {
vect.push_back(elem);
fields.erase(elem);
}
}
仅当我将 Sets 从 std::set 更改为 std::vector 时才出现此问题,这是必要的,因为我需要反向插入循环才能以这种方式工作。我完全不知道是什么导致了这种行为,并且非常感谢您解释这是如何发生的,当然我可以做些什么来解决它。
干杯!
解决方案
因为你在push_back
使用currentSet
:
如果新的 size() 大于 capacity() 则所有迭代器和引用(包括过去的迭代器)都将失效。
推荐阅读
- angularjs - 范围变量如何使用 angularjs 在 jasmine 框架中访问
- git - 如何在詹金斯文件中签出触发的构建分支详细信息
- scala - 需要 scala 中的示例程序用于 spark 数据帧
- android - Android 不会在 CardView 中将视图显示为行
- node.js - 我想知道如何使用 Puppeteer 的 $$eval
- python - 使用python3将json数据转换为csv但它不起作用
- python - 以管理员身份运行时是否可以从 python/batch 获取本地用户名?
- c++ - 使用反向引用移动多态成员的构造函数
- javascript - 无法使用 nuxt 中的 axios 从正确位置获取
- cordova - npm install -g ionic cordova 错误 JSON 意外结束