为什么STL排序不适用于地图
我是否缺少某些东西,或者我是否需要进行类似比较功能的排序。任何人都可以提出一些想法。
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
int main(){
std::map<int,std::vector<int>> map1;
map1[0].push_back(3);
map1[0].push_back(2);
map1[0].push_back(1);
map1[1].push_back(3);
map1[1].push_back(2);
map1[1].push_back(1);
for(auto i : map1){
std::cout<< i.first << " --> ";
for(auto j : i.second){
std::cout<<j<<" ";
}
std::cout<<"\n";
}
for(auto i : map1){
std::sort(i.second.begin(), i.second.end());
}
std::cout<<"\n";
for(auto i : map1){
std::cout<< i.first << " --> ";
for(auto j : i.second){
std::cout<<j<<" ";
}
std::cout<<"\n";
}
return 0;
}
排序前后的输出相同。
0-> 3 2 1
1-> 3 2 1
答案 0 :(得分:7)
遍历map1
中的条目时,您复制每个节点。因此,排序是在std::vector<int>
的独立,新创建的实例上执行的,并且该变量在循环本地的更改(例如,对其进行排序)在下一次迭代中已经丢失。
您需要将for循环的中心范围更改为
for(auto& i : map1) {
// ^ Loop over references to map nodes, not copies!
std::sort(i.second.begin(), i.second.end());
}
请注意,当您可以使用C ++ 17时,您可能希望使用结构化绑定来使循环更具表现力,
for(auto& [key, vec] : map1) {
std::sort(vec.begin(), vec.end());
}