簡體   English   中英

有效或無效的迭代器和迭代器位置

[英]Valid or Invalid Iterators And Iterator Positions

我下面有一個簡單的例程例程來擦除矢量元素,這些元素的位置存儲在另一個矢量中。 我已經使用此方法一段時間,直到最近才遇到錯誤:表達式:向量迭代器+偏移量超出范圍。

我似乎已經發現了問題,因為我沒有將第二個部分括在括號(第二個部分)中,這在擦除向量的末尾時會導致上述錯誤。

現在,我已經確定並糾正了問題,如果有人可以確認我下面的簡單例程實際上是有效的且沒有錯誤,並且以這種方式在for循環中調用delete(),我將不勝感激。

我意識到只有在按照從頭到尾的順序擦除元素位置時,此例程才有效。 請在下面查看我的代碼:

vector<int> mynumbers;
mynumbers.push_back(4);
mynumbers.push_back(5);
mynumbers.push_back(6);
mynumbers.push_back(7); 

vector<int> delpositions;
delpositions.push_back(1);
delpositions.push_back(2);
delpositions.push_back(3);  

for(unsigned int i = 0; i < delpositions.size(); ++i)   
    mynumbers.erase(mynumbers.begin() + (delpositions[i] - i));

// Used To Be: delpositions[i] - i Which Caused The Error! Instead of: (delpositions[i] - i)

您可以通過刪除元素的數量來調整“分布”來做正確的事情。 只要確保“布置”按升序排列即可。

以相反的順序(從后到先)擦除可能會更有效率。

我認為

vector result; 
result.reserve(mynumbers.size() - delpositions.size()); 
// copy valid positions to result 
mynumbers.swap(result)

更好的解決方案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM