Почему встроенная сортировка не умеет сортировать карту векторов? - PullRequest
3 голосов
/ 24 марта 2019

Почему сортировка 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 Ответ

7 голосов
/ 24 марта 2019

Зацикливая записи в вашем 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());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...