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
相关产品推荐
相关产品推荐

