Sortieren von Vektoren in C++
-
Verwenden des
std::sort
-Algorithmus zum Sortieren von Vektorelementen -
Verwendung der Funktion
std::sort
mit Lambda-Ausdruck zum Sortieren eines Vektors vonstruct
-
Verwendung der Funktion
std::sort
mit benutzerdefinierter Funktion zum Sortieren des Vektors vonstruct
Dieser Artikel zeigt verschiedene Methoden zum Sortieren eines Vektors in C++.
Verwenden des std::sort
-Algorithmus zum Sortieren von Vektorelementen
Die Funktion std::sort
implementiert einen generischen Algorithmus für die Arbeit mit verschiedenen Objekten und sortiert die angegebenen Elemente im Bereich mithilfe der als drittes Argument übergebenen Komparatorfunktion. Beachten Sie, dass die Funktion ohne das dritte Argument verwendet werden kann. In diesem Fall werden die Elemente mit operator<
sortiert. Der folgende Beispielcode zeigt ein solches Szenario, in dem das Element vom Typ Zeichenkette ist, die die Elementfunktion operator<
hat und mit dem Standardkomparator sortiert werden kann.
#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;
}
Ausgabe:
highway, song, world, death, mom, historian, menu, woman,
death, highway, historian, menu, mom, song, woman, world,
Verwendung der Funktion std::sort
mit Lambda-Ausdruck zum Sortieren eines Vektors von struct
Alternativ kann ein benutzerdefiniertes Komparatorfunktionsobjekt mit einem Lambda-Ausdruck erstellt werden, um die benutzerdefinierten Strukturen zu sortieren. In diesem Fall haben wir eine struct cpu
mit verschiedenen Datenelementen, und zwei sort
-Aufrufe werden erstellt, indem die Funktionsobjekte übergeben werden, die die Elemente value
bzw. property1
vergleichen.
#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;
}
Verwendung der Funktion std::sort
mit benutzerdefinierter Funktion zum Sortieren des Vektors von struct
Beachten Sie, dass die vorherige Methode für die Verwendung in größeren Codebasen ziemlich unflexibel ist und Code ziemlich umfangreich machen kann, wenn die Vergleichsfunktion kompliziert ist. Eine andere Lösung wäre, Vergleichsfunktionen als struct
-Mitglieder zu implementieren und sie als static
zu deklarieren, damit der Scope-Operator darauf zugreifen kann. Außerdem müssen diese Funktionen einen bool
-Wert zurückgeben und nur zwei Parameter haben.
#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