簡體   English   中英

使用std :: vector.erase(begin(),end())或std :: vector.erase(begin(),begin())是否安全?

[英]Is it safe to use std::vector.erase(begin(), end()) or std::vector.erase(begin(), begin())?

我想在一段時間內處理一個向量中的元素。 為了優化這一點,我不想在處理項目時刪除它,並在最后刪除所有已處理的項目。

vector<Item*>::iterator it;
for(it = items.begin(); it != items.end(); ++it)
{
    DoSomething(*it);

    if(TimeIsUp())
    {
        break;
    }
}

items.erase(items.begin(), it);

it == items.end()時使用擦除是否安全? 在文檔中,據說erase()將擦除[first,last],這應該是安全的,但我想確定。

編輯:

使用std :: vector.erase(begin(),begin())是否安全?

是的,這是正確的 - 這是符號[first, last)意思, end()指向一個結尾。

回答你的編輯:是的,那也沒關系。 vec.erase(q1,q2)定義為擦除“ [q1, q2)范圍內的元素”。 這兩個論點都是一樣的。 [q1, q2)被定義為const迭代器的有效范圍。 如果有一系列增量可以對q1進行到q2 ,則認為范圍是有效的 - 在這種情況下,序列沒有增量。 實際上,該標准專門定義了一個空范圍:

范圍[i,i)是空范圍

[first,last)意味着什么是firstlast之間的一切,包括first但不包括last 它表示半開集。 如果他們使用[first,last] ,也會包含last ; 如果他們使用(first,last)firstlast將被排除在外。

您的代碼存在問題。 你想在元素it被刪除,如果it不等於end() 你應該使用而不是items.erase (items.begin(),it)

if (it != items.end()) {
   items.erase (items.begin(), it+1);
}
else {
   items.clear(); // same as items.erase (items.begin(), items.end())
}

暫無
暫無

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

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