Trier la map par valeur en C++

Jinku Hu 12 octobre 2023
  1. Utilisez les algorithmes std::vector et std::sort pour trier les éléments de la carte par valeur en C++
  2. Utilisez std::map et std::map::emplace pour trier les éléments de la carte par valeur en C++
Trier la map par valeur en C++

Cet article présente plusieurs méthodes sur la façon de trier le mappage par valeurs en C++.

Utilisez les algorithmes std::vector et std::sort pour trier les éléments de la carte par valeur en C++

std::map est un conteneur associatif qui peut stocker des paires clé-valeur avec des clés uniques, et ces dernières sont utilisées pour trier automatiquement les éléments de l’objet. Dans ce cas, nous déclarons un exemple d’objet std::map avec des chaînes entières comme clés et des chaînes régulières comme valeurs. Le problème est de trier ces éléments par les valeurs des chaînes.

Nous ne pouvons pas utiliser directement l’algorithme std::sort sur la structure std::map, nous devons donc initialiser un autre objet qui peut être trié. Ainsi, la déclaration du std::vector contient les paires du même type. Nous construisons des éléments vector en utilisant la boucle for et la méthode emplace_back. Une fois la boucle exécutée, le vector est prêt à être passé à l’algorithme std::sort. Notez que nous spécifions l’expression lambda pour définir la fonction de comparaison d’éléments et qu’elle ne compare que les seconds membres. Enfin, nous pouvons afficher les éléments std::vector sous forme de représentation cartographique triée.

#include <iostream>
#include <map>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::map;
using std::string;
using std::vector;

int main() {
  map<string, string> veggy_map = {{
                                       "1",
                                       "Yam",
                                   },
                                   {
                                       "2",
                                       "Pumpkin",
                                   },
                                   {
                                       "3",
                                       "Ginger",
                                   },
                                   {
                                       "4",
                                       "Melon",
                                   },
                                   {
                                       "5",
                                       "Beetroot",
                                   },
                                   {
                                       "6",
                                       "Spinach",
                                   }};

  cout << "Unsorted - " << endl;
  for (const auto &[key, value] : veggy_map) {
    cout << key << " : " << value << endl;
  }

  vector<std::pair<string, string> > arr;
  for (const auto &item : veggy_map) {
    arr.emplace_back(item);
  }

  std::sort(arr.begin(), arr.end(),
            [](const auto &x, const auto &y) { return x.second < y.second; });

  cout << "Sorted - " << endl;
  for (const auto &[key, value] : arr) {
    cout << key << " : " << value << endl;
  }

  return EXIT_SUCCESS;
}

Production:

Sorted -
5 : Beetroot
3 : Ginger
4 : Melon
2 : Pumpkin
6 : Spinach
1 : Yam

Utilisez std::map et std::map::emplace pour trier les éléments de la carte par valeur en C++

La solution précédente ne traitait pas de l’objet std::map lui-même et utilisait une structure externe pour le tri. Dans ce cas, nous implémentons une solution pour stocker les éléments triés par valeur dans un autre objet std::map. Ceci peut être réalisé en utilisant la fonction de carte intégrée - emplace. A savoir, nous déclarons un autre objet map et construisons ses éléments en utilisant la méthode emplace, mais nous passons également les paires clé-valeur inversées. De ce fait, le conteneur map trie automatiquement les éléments par clés: les valeurs de l’objet map précédent. Ensuite, nous pouvons utiliser l’objet map trié pour d’autres opérations qui peuvent être nécessaires dans les blocs de code suivants sans se soucier qu’il soit stocké dans un objet différent.

#include <iostream>
#include <map>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::map;
using std::string;
using std::vector;

int main() {
  map<string, string> veggy_map = {{
                                       "1",
                                       "Yam",
                                   },
                                   {
                                       "2",
                                       "Pumpkin",
                                   },
                                   {
                                       "3",
                                       "Ginger",
                                   },
                                   {
                                       "4",
                                       "Melon",
                                   },
                                   {
                                       "5",
                                       "Beetroot",
                                   },
                                   {
                                       "6",
                                       "Spinach",
                                   }};

  cout << "Unsorted - " << endl;
  for (const auto& [key, value] : veggy_map) {
    cout << key << " : " << value << endl;
  }

  cout << "Sorted - " << endl;

  map<string, string> veggy_map2;

  for (const auto& [key, value] : veggy_map) {
    veggy_map2.emplace(value, key);
  }

  for (const auto& [key, value] : veggy_map2) {
    cout << value << " : " << key << endl;
  }

  return EXIT_SUCCESS;
}

Production:

Sorted -
5 : Beetroot
3 : Ginger
4 : Melon
2 : Pumpkin
6 : Spinach
1 : Yam
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Article connexe - C++ Map