[英]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.