簡體   English   中英

如何根據元素的某些屬性刪除std :: vector的元素?

[英]How would you remove elements of a std::vector based on some property of the elements?

例如,如果你有一個std::vector<MyClass> ,其中MyClass有一個公共方法: bool isTiredOfLife() ,你如何刪除返回true的元素?

我更喜歡remove_if

v.erase(remove_if(v.begin(), v.end(), 
                 mem_fun_ref(&MyClass::isTiredOfLife)), 
        v.end());

remove_if返回一個迭代器,該迭代器指向仍在序列中的最后一個元素。 erase擦除從第一個參數到最后一個參數(兩個迭代器)的所有內容。

使用remove_if是執行此操作的“正確”方法。 注意不要使用迭代器來循環和擦除,因為刪除項會使迭代器無效。 事實上,任何使用erase()作為主要方法的例子對矢量都是一個壞主意,因為擦除是O(n),這將使你的算法成為O(n ^ 2)。 這應該是O(n)算法。

我給出的方法可能比remove_if快,但與remove_if不同,它不會保留元素的相對順序。 如果您關心維護順序(即您的矢量已排序),請使用remove_if,如上面的答案所示。 如果您不關心訂單,並且要刪除的項目數通常少於矢量的四分之一,則此方法可能會更快:

for( size_t i = 0; i < vec.size(); )
   if( vec[i].isTiredOfLife() )
   {
      vec[i] = vec.back();
      vec.pop_back();
   }
   else
      ++i;

暫無
暫無

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

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