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

为何无法修改unordered_map<int,vector<int>>中存储的vector的大小?

问题解析:为何无法修改unordered_map中存储的vector大小?

这事儿的核心原因其实特别直白——你用map1.at(0)拿到的是原vector的副本,不是它的引用!所以你后面给node_sum添加元素,改的只是这个独立的副本,跟map里存的那个原vector完全是两码事。

具体原因拆解

当你执行node_sum = map1.at(0);这行代码时:

  • unordered_map::at()方法默认返回的是值类型,不是引用。这意味着程序会把map中键0对应的vector完整复制一份,然后把这个副本赋值给node_sum。
  • 此时node_sum和map里的vector占用的是两块完全独立的内存空间,后续对node_sum的任何修改都不会影响到map里的原数据。

这就解释了为什么输出里map1.at(0).size()还是1(原vector没被碰过),而node_sum.size()变成了3(副本被修改了)。

两种解决办法

1. 直接操作map中的vector

如果不需要单独存这个vector的引用,可以直接通过at()返回的结果修改原数据:

unordered_map<int, vector<int>> map1;
vector<int> node_sum;
node_sum.push_back(10);
map1.insert(pair<int, vector<int>>(0, node_sum));
// 直接修改map里的vector
map1.at(0).push_back(1);
map1.at(0).push_back(2);
cout <<"map1.at(0).size():"<< map1.at(0).size() << endl; // 输出3
cout << "node_sum.size():" << node_sum.size()<< endl; // 输出1(原node_sum没被修改)

2. 用引用变量接收map中的vector

如果需要多次操作这个vector,用引用类型接收at()的返回值,这样node_sum就会绑定到map里的原vector,而不是副本:

unordered_map<int, vector<int>> map1;
vector<int> node_sum;
node_sum.push_back(10);
map1.insert(pair<int, vector<int>>(0, node_sum));
// 注意这里的&,表示引用绑定
vector<int>& node_sum_ref = map1.at(0);
node_sum_ref.push_back(1);
node_sum_ref.push_back(2);
cout <<"map1.at(0).size():"<< map1.at(0).size() << endl; // 输出3
cout << "node_sum_ref.size():" << node_sum_ref.size()<< endl; // 输出3

小提醒

另外,如果你用map1[0]代替map1.at(0),它返回的同样是引用,但要注意:[]操作符会在键不存在时自动插入一个默认构造的vector,而at()会在键不存在时抛出out_of_range异常,根据你的业务需求选择合适的方法就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:17:49