Sortieren von Vektoren in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden des std::sort-Algorithmus zum Sortieren von Vektorelementen
  2. Verwendung der Funktion std::sort mit Lambda-Ausdruck zum Sortieren eines Vektors von struct
  3. Verwendung der Funktion std::sort mit benutzerdefinierter Funktion zum Sortieren des Vektors von struct
Sortieren von Vektoren in C++

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;
}
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