繁体   English   中英

std :: vector distance函数如何提供比.size()高的值?

[英]How can it be that the std::vector distance Function gives a higher value than .size()?

我有以下代码,其中myFields是对的std :: set,而currentSet是对的std :: vector,具有非常奇怪的行为:在条件为true的迭代之后, 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时才出现此问题,这是必需的,因为我需要向后插入才能使循环以这种方式工作。 我丝毫不知道是什么原因导致了这种行为,并且非常感谢您解释这种情况的发生方式,当然也可以解决该问题。

干杯!

因为您在currentSet上使用push_back

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

实际上, std::vector将其数组连续存储在内存中。

为此,它分配一个任意大小的数组(以避免在每个push_back()处重新分配)。
当我们执行了与可用分配空间一样多的push_back()std::vector将重新分配一个更大的数组以能够添加新元素。

问题就在这里,因为std::vector将其元素连续存储在内存中,它需要将已经存在的数据复制到新位置(更大的数组)。 然后,释放旧阵列。
因此,如果您有一个指向向量元素的迭代器,则在重新分配之后,该迭代器将变为无效并指向可用内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM