为什么对Map中迭代器关联的vector执行排序操作不生效?
问题原因
你代码中的范围for循环采用了值传递的方式遍历map元素:for(auto g: values)
这里的g是map中每个pair<int, vector<int>>元素的临时拷贝,你对g.second执行排序操作,修改的只是临时副本的内容,完全不会写入到原mapvalues的存储数据中,所以最后打印的时候还是排序前的原始值。
修复方案
只需要将循环变量修改为引用类型,直接操作原map中的元素即可:
map<int, vector<int> > values; values[1] = {3,1,2,4,5}; // 加&获取原元素的引用,修改会直接作用到原map上 for(auto& g: values) { sort(g.second.begin(), g.second.end()); } for(int i=0;i<values[1].size();i++) { cout<<values[1][i]<<" "; }
运行后输出结果为1 2 3 4 5,符合预期。
额外建议
日常遍历容器时,如果不需要修改元素,建议使用const auto&的方式遍历,既能避免不必要的拷贝开销,也能防止误改数据;需要修改元素时就用非const的引用即可。
内容的提问来源于stack exchange,提问作者2997ms
相关产品推荐
相关产品推荐

