[英]Can I use std::vector.size() to control a loop that's removing elements?
我正在研究的對象檢測器非常頭痛。
我已經在其他可能存在問題的部分上創建了該線程: 堆損壞試圖向現有std :: vector添加元素
但是,現在,我在想也許從向量中刪除元素的方式可能是我的問題。 所以,一個簡單的問題,我可以做這樣的事情嗎?
for (int i=0; i < vector.size(); i++){
if(iNeedToRemoveThisElement){
std::swap(vector[i],vector.back());
vector.pop_back();
i--;
}
?
您的循環正常(假設iNeedToRemoveThisElement
不會做任何不好的事情)。 每次都執行循環條件,因此您總是將其與反映最新更新的當前vector.size()
進行比較。
此外,仔細檢查循環還會發現您沒有陷入比較的另一個潛在陷阱:如果i
為負,則比較會vector.size()
false
因為vector.size()
是無符號的。 但是事實證明,在進行比較時, i
永遠不會為負。
有一個需要我不確定的警告:如果i
指的是最后一個元素,則將其與自身交換; 我不確定這是否是定義的行為(對於C ++ 98 / C ++ 03復制實現,當然沒有問題,但是我不確定C ++ 11 move實現是否也支持它)。 因此, 可能需要對此進行特殊處理。 更新:正如dyp在評論中解釋的那樣,允許自動交換,因此無需特殊情況。
無論如何,您應該從C ++標准庫中查找算法std::remove
和std::remove_if
。 它們使您可以完全擺脫循環,如果您可以使用C ++ 11的lambda函數,它也比循環更簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.