79 votes

Trier std::map à l'aide de la valeur

J'ai besoin de trier un std::map par valeur plutôt que par clé. Y a-t-il un moyen facile de le faire?

J'ai eu une solution du fil suivant: std::map trier par données ? Existe-t-il une meilleure solution ?

 map<long, double> testMap;
// some code to generate the values in the map.

sort(testMap.begin(), testMap.end());  // is there any function like this to sort the map?

51voto

NielW Points 523

J'avais besoin de quelque chose de similaire, mais la carte inversée ne fonctionnerait pas pour moi. J'ai juste copié ma carte (freq ci-dessous) dans un vecteur de paires, puis j'ai trié les paires comme je le voulais.

 std::vector<std::pair<int, int>> pairs;
for (auto itr = freq.begin(); itr != freq.end(); ++itr)
    pairs.push_back(*itr);

sort(pairs.begin(), pairs.end(), [=](std::pair<int, int>& a, std::pair<int, int>& b)
{
    return a.second < b.second;
}
);

15voto

Bogatyr Points 12027

Si vous souhaitez présenter les valeurs d'une carte dans l'ordre trié, copiez les valeurs de la carte dans le vecteur et triez le vecteur.

8voto

cxwangyi Points 468

J'aime la réponse d'Oli (retourner une carte), mais il semble qu'il y ait un problème: la carte du conteneur n'autorise pas deux éléments avec la même clé.

Une solution est de faire dst le type multimap. Une autre consiste à vider src dans un vecteur et à trier le vecteur. Le premier nécessite des modifications mineures à la réponse d'Oli, et le dernier peut être implémenté en utilisant la copie STL de manière concise

 #include <iostream>
#include <utility>
#include <map>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
  map<int, int> m;
  m[11] = 1;
  m[22] = 2;
  m[33] = 3;

  vector<pair<int, int> > v;
  copy(m.begin(),
       m.end(),
       back_inserter<vector<pair<int, int> > >(v));

  for (size_t i = 0; i < v.size(); ++i) {
    cout << v[i].first << " , " << v[i].second << "\n";
  }

  return 0;
};

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X