STL从vector中移除与谓词匹配的第一个元素
STL remove first element that matches a predicate from a vector
擦除与谓词匹配的向量中的第一个元素的有效方法是什么?我在一个向量中存储唯一的值,所以我不希望算法搜索整个容器。
当前我正在做:
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()
),因为它基于范围。
如果你不关心保持向量稳定(或排序!),你也可以将找到的元素swap
到back()
和pop_back()
,这将略微提高平均(但不是渐进的!)运行时间。
别忘了这也是一种普遍接受的c++习惯用法,所以它更容易被识别。
相关文章:
- 如何实现 Front() 方法以返回模板化双向链表C++的第一个元素?
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- C++ queue.front();为什么不从第一个元素开始呢?
- 指向数组基址的指针而不是指向第一个元素的指针有什么优点?
- 静态堆栈函数不会 1) 输入第一个元素 2)添加新元素时识别旧元素
- 从队列中删除第一个元素C++
- 如果第一个元素包含任何零,则我的程序以不希望的方式运行
- 为什么数组不打印第一个元素?
- 在数组中显示第一个元素用户输入
- 消除集合的第一个元素
- 为什么指向矢量第一个元素的指针会丢失?
- 如何打印出常量字符串的第一个元素?
- 读取数组的第一个元素还是第 4000 个元素更快?
- 如何在数组的一部分中查找特定值的第一个元素
- 对数组进行排序的算法,先是第一个元素,然后是前 2 个元素,然后是前 3 个元素,依此类推
- 访问指向对象指针向量的指针的第一个元素?
- 引用保留向量中的第一个元素
- 指向数组的指针是否应该等于指向其第一个元素的指针?
- 尝试将参数包的第一个元素作为函数调用,并将包的其余部分作为参数传递给它
- 代码是否有效.如果我想显示第一个元素?如果不是,那么 s.begin() 会返回什么?