[英]How to slice a `std::vector` based on elements in `std::set`
[英]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.