You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何删除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 15:36:03