STL删除与向量中的谓词匹配的第一个元素

时间:2014-05-06 09:37:59

标签: c++ vector stl predicate

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

目前我在做:

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

提前谢谢。

1 个答案:

答案 0 :(得分:2)

只有一点点改进:

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()
);

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

如果您不关心保持向量稳定(或排序!),您还可以swap找到back()pop_back()的元素,这会略微改善平均(但不是渐近!)运行时。

不要忘记这也是一种普遍接受的C ++习语,因此可以更容易识别。