为何无法修改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
相关产品推荐
相关产品推荐

