为什么内置排序无法对向量的映射进行排序?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么内置排序无法对向量的映射进行排序?相关的知识,希望对你有一定的参考价值。
为什么STL排序不适用于map <int,vector <int >>?
我错过了什么,或者我需要做比较功能和排序。任何人都可以提出一些想法。
#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<<"
";
}
for(auto i : map1){
std::sort(i.second.begin(), i.second.end());
}
std::cout<<"
";
for(auto i : map1){
std::cout<< i.first << " --> ";
for(auto j : i.second){
std::cout<<j<<" ";
}
std::cout<<"
";
}
return 0;
}
排序前后的输出相同。
0 --> 3 2 1
1 --> 3 2 1
答案
循环遍历map1
中的条目时,复制每个节点。因此,排序是在独立的,新创建的std::vector<int>
实例上执行的,并且对该循环本地变量的改变(例如,对其进行排序)在下一次迭代中已经丢失。
您需要根据循环更改中心范围
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());
}
以上是关于为什么内置排序无法对向量的映射进行排序?的主要内容,如果未能解决你的问题,请参考以下文章