如何删除C++ vector中first为指定值的pair元素?
实现方案
这种vector批量删除符合条件元素的场景,非常推荐使用erase-remove idiom,是目前连续存储容器批量删除的最优方案,效率高且不会踩迭代器失效的坑。
你要校验pair的first值,只需要在删除条件判断里访问p.first即可,不同C++版本的具体实现如下:
1. C++11及以上版本(最常用,lambda实现最简洁)
需要引入头文件 <algorithm>,核心代码如下:
#include <vector> #include <algorithm> int main() { std::vector<std::pair<int,int>> v = {{1,2}, {2,3}, {2,4}, {5,4}}; int target_first = 2; // 要删除的first指定值 // erase-remove 核心逻辑 v.erase( std::remove_if(v.begin(), v.end(), [target_first](const std::pair<int, int>& p) { // 这里写判断逻辑,返回true的元素会被标记为待删除 return p.first == target_first; }), v.end() ); // 执行后v就是{{1,2}, {5,4}}的结果 return 0; }
逻辑说明:std::remove_if会遍历整个vector,把所有不符合删除条件的元素移到容器前部,返回第一个待删除元素的迭代器;之后erase直接从这个迭代器删除到容器末尾,一次性完成所有删除操作,整体时间复杂度为O(n)。
2. C++03及更早版本(无lambda,用仿函数实现)
如果使用的是旧版C++标准不支持lambda,写一个简单的判断仿函数即可:
#include <vector> #include <algorithm> struct FirstEqTarget { int target; FirstEqTarget(int t) : target(t) {} bool operator()(const std::pair<int, int>& p) const { return p.first == target; } }; int main() { std::vector<std::pair<int,int>> v; // 给v赋值逻辑省略 v.erase( std::remove_if(v.begin(), v.end(), FirstEqTarget(2)), v.end() ); return 0; }
不推荐的实现方式
不建议自己手写for循环遍历erase,不仅最坏时间复杂度会到O(n²),还很容易踩迭代器失效的坑:
错误/不推荐写法示例(即使能跑也不建议用):
// 容易漏处理迭代器返回值导致bug for (auto it = v.begin(); it != v.end(); ++it) { if (it->first == 2) { v.erase(it); } }
内容的提问来源于stack exchange,提问作者InsertaRandomNameNow
相关产品推荐
相关产品推荐

