簡體   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