STL-Algorithmen in C++
-
Verwendung des
std::sort
-Algorithmus zum Sortieren allgemeiner Vektorbereiche in C++ -
Verwenden Sie den
std::reverse
-Algorithmus, um die Reihenfolge der Elemente in C++ umzukehren -
Verwendung des
std::accumulate
-Algorithmus zur Berechnung der Summe der Elemente in einem Bereich in C++ -
Verwenden Sie den
std::count
-Algorithmus, um die Anzahl der Elemente zu zählen, die die spezifischen Kriterien in C++ erfüllen
In diesem Artikel werden verschiedene Funktionen aus der STL-Algorithmusbibliothek in C++ vorgestellt.
Verwendung des std::sort
-Algorithmus zum Sortieren allgemeiner Vektorbereiche in C++
std::sort
ist einer der am häufigsten verwendeten Algorithmen in STL. Es verfügt über mehrere Überladungen, von denen die einfachste zwei Iteratoren akzeptiert, die die Anforderungen von LegacyRandomAccessIterator
erfüllen, und Elemente in nicht absteigender Reihenfolge sortiert. Letzteres wird gesagt, weil die Einhaltung der Reihenfolge gleicher Elemente nicht garantiert ist.
std::sort
wird häufig in Vektor
-Bereichen verwendet. Der folgende Codeausschnitt demonstriert die Verwendung als solche. Der Algorithmus kann optional die Vergleichsfunktion übernehmen, die verwendet wird, um Elementpaare auszuwerten und den Bereich entsprechend zu sortieren.
Das folgende Beispiel zeigt eine Zeile, in der das STL-Funktionsobjekt - std::greater
als Vergleichsfunktion übergeben wird. Alternativ kann man ein benutzerdefiniertes Funktionsobjekt definieren oder den Lambda-Ausdruck direkt als dritten Parameter von std::sort
angeben.
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
template <typename T>
void printRange(std::vector<T> v) {
for (const auto &item : v) {
cout << item << ", ";
}
cout << endl;
}
int main() {
std::vector<int> v1 = {1, 3, 5, 11, 9, 10, 13, 20};
std::sort(v1.begin(), v1.end());
printRange(v1);
std::sort(v1.begin(), v1.end(), std::greater<>());
printRange(v1);
std::sort(v1.begin(), v1.end(), [](int a, int b) { return (a - 2) != b; });
printRange(v1);
return EXIT_SUCCESS;
}
Ausgabe:
1, 3, 5, 9, 10, 11, 13, 20,
20, 13, 11, 10, 9, 5, 3, 1,
1, 3, 5, 9, 10, 11, 13, 20
Verwenden Sie den std::reverse
-Algorithmus, um die Reihenfolge der Elemente in C++ umzukehren
std::reverse
kann verwendet werden, um den Inhalt von Sequenzcontainern wie vector
, list
oder deque
umzukehren. Die Funktion akzeptiert zwei Iteratorparameter und kann mit jedem generischen Typ arbeiten. Das folgende Codebeispiel zeigt zwei Szenarien, in denen vector
von Ganzzahlen und list
von Zeichenketten umgekehrt werden. Wir sortieren auch das list
-Objekt mit der sort
-Memberfunktion, bevor wir den std::reverse
-Algorithmus aufrufen. Beachten Sie, dass der std::sort
-Algorithmus nicht auf dem std::list
-Container funktioniert.
#include <algorithm>
#include <iostream>
#include <list>
#include <string>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::list;
using std::string;
using std::vector;
template <typename T>
void printRange(std::vector<T> v) {
for (const auto &item : v) {
cout << item << ", ";
}
cout << endl;
}
template <typename T>
void printRange(std::list<T> v) {
for (const auto &item : v) {
cout << item << ", ";
}
cout << endl;
}
int main() {
std::vector<int> v1 = {1, 3, 5, 11, 9, 10, 13, 20};
std::list<string> l1 = {"htop", "wtop", "rtop", "ktop", "ktop", "ptop"};
std::reverse(v1.begin(), v1.end());
printRange(v1);
l1.sort();
std::reverse(l1.begin(), l1.end());
printRange(l1);
return EXIT_SUCCESS;
}
Ausgabe:
20, 13, 10, 9, 11, 5, 3, 1,
wtop, rtop, ptop, ktop, ktop, htop,
Verwendung des std::accumulate
-Algorithmus zur Berechnung der Summe der Elemente in einem Bereich in C++
std::accumulate
ist Teil numerischer Algorithmen, die verwendet werden können, um allgemeine arithmetische Operationen an jedem Element des gegebenen Bereichs durchzuführen. In diesem Fall berechnet der angegebene Algorithmus die Gesamtsumme jedes Elements im Bereich. std::accumulate
hat zwei Überladungen, von denen die erste die beiden Iteratoren nimmt, die den Bereich selbst bezeichnen, und den Wert init
, der den Startwert für die Summation darstellt. Die zweite Überladung kann optional ein Funktionsobjekt als vierten Parameter annehmen, der anstelle der Summation angewendet wird.
#include <algorithm>
#include <iostream>
#include <numeric>
#include <string>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
int main() {
std::vector<int> v1 = {1, 3, 5, 11, 9, 10, 13, 20};
auto sum = std::accumulate(v1.begin(), v1.end(), 0);
cout << "Sum of 'v1' vector = " << sum << endl;
sum = std::accumulate(v1.begin(), v1.end(), 1, std::multiplies());
cout << "Accumulate of 'v1' vector = " << sum << endl;
return EXIT_SUCCESS;
}
Ausgabe:
Sum of 'v1' vector = 72
Accumulate of 'v1' vector = 3861000
Verwenden Sie den std::count
-Algorithmus, um die Anzahl der Elemente zu zählen, die die spezifischen Kriterien in C++ erfüllen
Die Funktion std::count
ist eine nützliche Methode, um bestimmte Elemente im angegebenen Bereich zu zählen. Wir können nämlich die Bereichs-Iteratoren und den value
übergeben, um alle Elemente abzugleichen, die dem angegebenen Wert entsprechen. Eine andere Überladung kann ein unäres Prädikat akzeptieren, das die gültigen Übereinstimmungen auswertet und der Algorithmus die Anzahl entsprechend abruft. Im nächsten Beispiel haben wir einen Lambda-Ausdruck angegeben, um gerade Zahlen im vector
-Objekt zu zählen.
#include <algorithm>
#include <iostream>
#include <list>
#include <numeric>
#include <string>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
int main() {
std::vector<int> v1 = {1, 3, 5, 11, 9, 10, 13, 20};
auto count_10 = std::count(v1.begin(), v1.end(), 10);
cout << count_10 << " occurrences of number 10" << endl;
auto count_even =
std::count_if(v1.begin(), v1.end(), [](int i) { return i % 2 == 0; });
cout << count_even << " even numbers in 'v1' vector" << endl;
return EXIT_SUCCESS;
}
Ausgabe:
1 occurrences of number 10
2 even numbers in 'v1' vector
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