2013-08-16 139 views
0

我有一個簡單的例子程序,用於清除矢量元素,其位置存儲在另一個矢量中。我一直在使用這種方法一段時間,直到最近才遇到一個錯誤:表達式:向量迭代器+偏移超出範圍。有效的或無效的迭代器和迭代器位置

我似乎已經發現問題,即在erase()調用的參數內,我沒有將括號中的第二部分括起來,偶爾會導致上述錯誤消除臨近向量末尾的元素。

現在我已經確定並糾正了這個問題,如果有人能確認我的簡單例程實際上是有效的並且沒有錯誤,並且在此for循環中調用erase()方式沒問題。

我意識到這個例程只有在按照先到後的順序擦除元素位置時纔有效。請參閱我的代碼如下:

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) 
+0

你不給足夠的上下文是明確的這件事,但你的做法(存儲元素的絕對位置在單獨的載體抹去,是要被排序)傾向於指示[代碼氣味](http://en.wikipedia.org/wiki/Code_smell)。 –

回答

1

您通過調整刪除元素的「刪除位置」來做正確的事情。只要確保'delpositions'按升序排序。

以相反順序擦除(從上到下)可能會更有效一些。

我認爲

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

一個更好的解決方案

+0

謝謝你們兩位。非常感激。我可能會不時地使用這種方法,代碼味道與否。 – user1831698

+0

編輯:感謝鏈接'代碼味道'我以前沒有讀過。 – user1831698

+0

謝謝你的Dieter。我也會考慮這種方式。乾杯。 – user1831698