Sortieren eines Vektors von Paaren in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie den std::sort-Algorithmus, um den Vektor von Paaren nach den Werten des ersten Elements in C++ zu sortieren
  2. Verwenden Sie den std::sort-Algorithmus mit Lambda-Ausdruck, um den Vektor von Paaren nach den Werten des zweiten Elements in C++ zu sortieren
  3. Verwendung von den std::sort-Algorithmus mit einer benutzerdefinierten Funktion zum Sortieren von Vektoren von Paaren in C++
Sortieren eines Vektors von Paaren in C++

In diesem Artikel wird erklärt, wie ein Vektor von Paaren in C++ sortiert wird.

Verwenden Sie den std::sort-Algorithmus, um den Vektor von Paaren nach den Werten des ersten Elements in C++ zu sortieren

Paare werden als separate Klasse in der C++-Standardvorlagenbibliothek bereitgestellt. Es implementiert einen Typ zum Speichern von zwei heterogenen Objekten als eine einzige Einheit. Der std::pair-Algorithmus ist im Wesentlichen eine tupelartige Datenstruktur mit nur zwei Elementen.

Ein Paarobjekt wird mit zwei Vorlagenparametern deklariert, die den Typ jedes Elements angeben. Wir können einen Vektor von pair-Objekten deklarieren, indem wir die Paardeklaration als Vektorvorlagenparameter platzieren. Ein Vektor von Paaren kann mit einer Initialisierungsliste initialisiert werden, indem jedes Paar mit separaten geschweiften Klammern übergeben wird, wie im folgenden Codeausschnitt gezeigt.

Wir können den Vektor von Paaren mit dem von STL bereitgestellten generischen Sortieralgorithmus sortieren. Die Funktion std::sort nimmt zwei Iteratoren des zu sortierenden Bereichs und ordnet die Elemente standardmäßig in nicht absteigender Reihenfolge neu an. Bei Paaren wird der Vektor nach dem ersten Element jedes Paares sortiert.

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::pair;
using std::string;
using std::vector;

template <typename T>
void printVector(vector<T> &vec) {
  for (const auto &item : vec) {
    cout << "{" << item.first << "," << item.second << "}"
         << "; ";
  }
  cout << endl;
}

int main() {
  vector<pair<int, string>> vec1 = {
      {12, "eleven"}, {32, "thirty-two"}, {6, "six"}, {43, "forty-three"}};

  cout << "vec1: ";
  printVector(vec1);

  std::sort(vec1.begin(), vec1.end());

  cout << "vec1: ";
  printVector(vec1);

  return EXIT_SUCCESS;
}

Ausgabe:

vec1: {12,eleven}; {32,thirty-two}; {6,six}; {43,forty-three};
vec1: {6,six}; {12,eleven}; {32,thirty-two}; {43,forty-three};

Verwenden Sie den std::sort-Algorithmus mit Lambda-Ausdruck, um den Vektor von Paaren nach den Werten des zweiten Elements in C++ zu sortieren

Alternativ können wir den angegebenen Vektor von Paaren nach den Werten des zweiten Elements sortieren, wenn wir dem Algorithmus std::sort ein optionales Vergleichsfunktionsobjekt übergeben. In diesem Fall verwenden wir einen Lambda-Ausdruck, um ein Funktionsobjekt zu bilden und übergeben es als drittes Argument des Funktionsaufrufs sort. Beachten Sie, dass dies im Wesentlichen die Methode ist, um eine benutzerdefinierte Vergleichsroutine für die Elemente des Paares zu definieren.

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::pair;
using std::string;
using std::vector;

template <typename T>
void printVector(vector<T> &vec) {
  for (const auto &item : vec) {
    cout << "{" << item.first << "," << item.second << "}"
         << "; ";
  }
  cout << endl;
}

int main() {
  vector<pair<int, string>> vec1 = {
      {12, "eleven"}, {32, "thirty-two"}, {6, "six"}, {43, "forty-three"}};

  cout << "vec1: ";
  printVector(vec1);

  std::sort(vec1.begin(), vec1.end(),
            [](const auto &x, const auto &y) { return x.second < y.second; });

  cout << "vec1: ";
  printVector(vec1);
  cout << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

vec1: {12,eleven}; {32,thirty-two}; {6,six}; {43,forty-three};
vec1: {12,eleven}; {43,forty-three}; {6,six}; {32,thirty-two};

Verwendung von den std::sort-Algorithmus mit einer benutzerdefinierten Funktion zum Sortieren von Vektoren von Paaren in C++

Eine andere Methode, eine Vergleichsfunktion an den std::sort-Algorithmus zu übergeben, besteht darin, eine separate Funktion in Form von bool cmp(const Type1 &a, const Type2 &b) zu definieren. Im Allgemeinen hat std::sort die Laufzeitkomplexität O(nlogn).

Das folgende Beispiel definiert eine sortPairs-Funktion, die die ersten Elemente in jedem Paar vergleicht. Sie können jedoch eine komplexere Vergleichsfunktion für die Paare definieren, die benutzerdefinierte Klassenobjekte speichern oder wenn mehrere Datenmember ausgewertet werden müssen.

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::pair;
using std::string;
using std::vector;

template <typename T>
void printVector(vector<T> &vec) {
  for (const auto &item : vec) {
    cout << "{" << item.first << "," << item.second << "}"
         << "; ";
  }
  cout << endl;
}

bool sortPairs(const pair<int, string> &x, const pair<int, string> &y) {
  return x.first > y.first;
}

int main() {
  vector<pair<int, string>> vec1 = {
      {12, "eleven"}, {32, "thirty-two"}, {6, "six"}, {43, "forty-three"}};

  cout << "vec1: ";
  printVector(vec1);

  std::sort(vec1.begin(), vec1.end(), sortPairs);

  cout << "vec1: ";
  printVector(vec1);
  cout << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

vec1: {12,eleven}; {32,thirty-two}; {6,six}; {43,forty-three};
vec1: {43,forty-three}; {32,thirty-two}; {12,eleven}; {6,six};
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++ Vector