为什么内置排序无法对向量图进行排序?

时间:2019-03-24 20:02:12

标签: c++ sorting dictionary vector

为什么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

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());
}