STL从vector中移除与谓词匹配的第一个元素

STL remove first element that matches a predicate from a vector

本文关键字:第一个 元素 谓词 vector STL      更新时间:2023-10-16

擦除与谓词匹配的向量中的第一个元素的有效方法是什么?我在一个向量中存储唯一的值,所以我不希望算法搜索整个容器。

当前我正在做:

if ((auto it = std::find_if(container.begin(),container.end(),
    [](Type& elem){ return elem == value;}) != container.end()))
{
        container.erase(it);
}

只有很小的改进:

container.erase(
  std::remove(container.begin(), container.end(), value),
  container.end()
);

如果你想使用一个一元谓词my_predicate:

container.erase(
  std::remove_if(container.begin(), container.end(), my_predicate),
  container.end()
);

这具有完全相同的性能特征(查找+擦除一起将触及所有元素),但优雅地避免了特殊情况(!= container.end()),因为它基于范围。

如果你不关心保持向量稳定(或排序!),你也可以将找到的元素swapback()pop_back(),这将略微提高平均(但不是渐进的!)运行时间。

别忘了这也是一种普遍接受的c++习惯用法,所以它更容易被识别。