Trier la map par valeur en C++
-
Utilisez les algorithmes
std::vector
etstd::sort
pour trier les éléments de la carte par valeur en C++ -
Utilisez
std::map
etstd::map::emplace
pour trier les éléments de la carte 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
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