删除匹配谓词的向量中的第一个元素有什么有效方法?我在向量中存储唯一值,所以我不希望算法搜索整个容器。
目前我在做:
if ((auto it = std::find_if(container.begin(),container.end(),
[](Type& elem){ return elem == value;}) != container.end()))
{
container.erase(it);
}
提前谢谢。
答案 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 ++习语,因此可以更容易识别。