STL-Algorithmen in C++

Jinku Hu 12 Oktober 2023
  1. Verwendung des std::sort-Algorithmus zum Sortieren allgemeiner Vektorbereiche in C++
  2. Verwenden Sie den std::reverse-Algorithmus, um die Reihenfolge der Elemente in C++ umzukehren
  3. Verwendung des std::accumulate-Algorithmus zur Berechnung der Summe der Elemente in einem Bereich in C++
  4. Verwenden Sie den std::count-Algorithmus, um die Anzahl der Elemente zu zählen, die die spezifischen Kriterien in C++ erfüllen
STL-Algorithmen in C++

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
Autor: 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

Verwandter Artikel - C++ Algorithm