Trier le vecteur en C++
-
Utilisez l’algorithme
std::sort
pour trier les éléments vectoriels -
Utilisez la fonction
std::sort
avec l’expression Lambda pour trier le vecteur destruct
-
Utilisez la fonction
std::sort
avec une fonction personnalisée pour trier le vecteur destruct
Cet article présente plusieurs méthodes de tri d’un vecteur en C++.
Utilisez l’algorithme std::sort
pour trier les éléments vectoriels
La fonction std::sort
implémente un algorithme générique pour travailler avec différents objets et trie les éléments donnés dans la plage en utilisant la fonction de comparaison passée comme troisième argument. Notez que la fonction peut être utilisée sans le troisième argument, auquel cas les éléments sont triés à l’aide de operator<
. L’exemple de code suivant illustre un tel scénario, où l’élément est de type string, qui a la fonction membre operator<
et peut être trié avec le comparateur par défaut.
#include <algorithm>
#include <iostream>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::sort;
using std::string;
using std::vector;
template <typename T>
void printVector(vector<T> &vec) {
for (const auto &item : vec) {
cout << item << ", ";
}
cout << endl;
}
int main() {
vector<string> vec1 = {"highway", "song", "world", "death",
"mom", "historian", "menu", "woman"};
printVector(vec1);
sort(vec1.begin(), vec1.end());
printVector(vec1);
return EXIT_SUCCESS;
}
Production:
highway, song, world, death, mom, historian, menu, woman,
death, highway, historian, menu, mom, song, woman, world,
Utilisez la fonction std::sort
avec l’expression Lambda pour trier le vecteur de struct
Alternativement, un objet fonction de comparateur personnalisé peut être construit avec une expression lambda pour trier les structures définies par l’utilisateur. Dans ce cas, nous avons une struct cpu
avec des données membres différents, et deux appels sort
sont construits en passant les objets fonction qui comparent respectivement les membres value
ou property1
.
#include <algorithm>
#include <iostream>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::sort;
using std::string;
using std::vector;
struct cpu {
string property1;
string property2;
string property3;
int value;
} typedef cpu;
void printVector(vector<cpu> &vec) {
for (const auto &item : vec) {
cout << item.property1 << " : " << item.property2 << " : " << item.property3
<< " : " << item.value << endl;
}
cout << endl;
}
int main() {
vector<cpu> vec3 = {{"WMP", "GR", "33", 2023},
{"TPS", "US", "31", 2020},
{"EOM", "GB", "36", 2021},
{"AAW", "GE", "39", 2024}};
printVector(vec3);
sort(vec3.begin(), vec3.end(),
[](cpu &x, cpu &y) { return x.value < y.value; });
sort(vec3.begin(), vec3.end(),
[](cpu &x, cpu &y) { return x.property1 < y.property1; });
printVector(vec3);
return EXIT_SUCCESS;
}
Utilisez la fonction std::sort
avec une fonction personnalisée pour trier le vecteur de struct
Notez que la méthode précédente est assez rigide pour être utilisée dans des bases de code plus grandes et peut rendre le code assez volumineux si la fonction de comparaison est compliquée. Une autre solution serait d’implémenter des fonctions de comparaison en tant que membres struct
et de les déclarer comme statiques
pour être accessibles via l’opérateur scope. De plus, ces fonctions doivent renvoyer une valeur booléenne
et n’avoir que deux paramètres.
#include <algorithm>
#include <iostream>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::sort;
using std::string;
using std::vector;
struct cpu {
string property1;
string property2;
string property3;
int value;
public:
static bool compareCpusByValue(cpu &a, cpu &b) { return a.value < b.value; }
static bool compareCpusByProperty1(cpu &a, cpu &b) {
return a.property1 < b.property1;
}
} typedef cpu;
void printVector(vector<cpu> &vec) {
for (const auto &item : vec) {
cout << item.property1 << " : " << item.property2 << " : " << item.property3
<< " : " << item.value << endl;
}
cout << endl;
}
int main() {
vector<cpu> vec3 = {{"WMP", "GR", "33", 2023},
{"TPS", "US", "31", 2020},
{"EOM", "GB", "36", 2021},
{"AAW", "GE", "39", 2024}};
printVector(vec3);
sort(vec3.begin(), vec3.end(), cpu::compareCpusByProperty1);
sort(vec3.begin(), vec3.end(), cpu::compareCpusByValue);
printVector(vec3);
return EXIT_SUCCESS;
}
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