首页 > 解决方案 > 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 时才出现此问题,这是必要的,因为我需要反向插入循环才能以这种方式工作。我完全不知道是什么导致了这种行为,并且非常感谢您解释这是如何发生的,当然我可以做些什么来解决它。

干杯!

标签: c++iteratorstdvector

解决方案


因为你在push_back使用currentSet

如果新的 size() 大于 capacity() 则所有迭代器和引用(包括过去的迭代器)都将失效。


推荐阅读