簡體   English   中英

我可以使用std :: vector.size()來控制要刪除元素的循環嗎?

[英]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::removestd::remove_if 它們使您可以完全擺脫循環,如果您可以使用C ++ 11的lambda函數,它也比循環更簡單。

暫無
暫無

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

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