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

C++ set<pair<int,vector<int>>>修改内部vector元素报错问题

报错根本原因

std::set是有序关联容器,内部按照元素的比较规则以有序结构存储元素,为了避免修改元素破坏内部排序、导致容器逻辑失效,set中存储的所有元素都是const常量,通过迭代器拿到的元素引用不允许直接修改。

你代码中set的元素类型是pair<int, vector<int>>,pair的默认比较规则是先比较第一个int字段,int相等时会逐元素比较第二个vector字段确定顺序。你通过迭代器访问到的是const pair<int, vector<int>>类型的对象:

  • 读取first字段、调用second.size()都是const级别的只读操作,所以可以正常执行
  • 调用second.push_back()是修改vector内容的写操作,违反了const限定,编译器会直接报错。
    就算绕过const限制强行修改,vector内容变化后这个元素的排序位次就会改变,会导致set后续的查找、遍历出现未定义行为。
简便修复方案

根据实际业务场景二选一即可:

方案1:不更换容器,最小改动适配set规则

如果你的业务确实需要把整个pair(包括vector内容)作为排序依据,就按照「拷贝旧值→删除旧元素→修改拷贝值→重新插入」的流程操作,不会破坏set的内部结构,改动量极小:

if ( it != s.end() ) {
    cout<<(*it).first<<endl ;
    cout<<(*it).second.size()<<endl ;

    // 替换原来直接push_back的逻辑
    pairs tmp = *it;       // 拷贝出待修改的元素
    s.erase(it);           // 删除set中原有元素
    tmp.second.push_back(10001); // 修改临时拷贝的内容
    s.insert(tmp);         // 把修改后的元素插回set,自动放到正确的排序位置
}

方案2:更换更贴合需求的容器

如果你的排序、查找逻辑只依赖pair里的第一个int值,vector内容完全不参与排序判定,直接把set<pair<int, vector<int>>>换成map<int, vector<int>>即可。map的键(int值)是const不可修改的,但是值(vector)可以任意修改,不需要删了重插,代码写起来更简洁:

// 容器定义改成map
map<int, vector<int>> m;
// 初始化逻辑对应改成
for ( int i =0; i<5; i++){
    vector<int> v ;
    for ( int j = i; j<=i + i; j++){
        v.push_back(j) ;
    }
    m[i] = v; // 直接赋值即可
}
// 查找逻辑
auto it = m.find(val);
if (it != m.end()) {
    // 可以直接修改value,没有const限制
    it->second.push_back(10001);
}

内容的提问来源于stack exchange,提问作者humblefool

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:45:18