为什么内置排序无法对向量的映射进行排序?

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

以上是关于为什么内置排序无法对向量的映射进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

使用涉及地图的比较器对项目向量进行排序

对未排序的向量进行合并排序

对没有比较器或 lambda 函数的向量进行排序?

如何在没有“排序”的情况下对对象向量进行排序

使用自定义排序对向量进行排序

Grails 映射对多个字段进行排序 :: Groovy 对多个映射条目进行排序