HOWTO · C++

Sortieren einer Zeichenkette in C++

In diesem Artikel wird veranschaulicht, wie Sie eine Zeichenkette in C++ sortieren.

Auf dieser Seite

In diesem Handbuch werden verschiedene Methoden zum Sortieren einer Zeichenkette in C++ erläutert.

Verwenden Sie den std::sort-Algorithmus, um die Zeichenkette in C++ zu sortieren

In diesem Artikel gehen wir davon aus, dass die Zeichenkette in einem std::string-Objekt gespeichert ist. Da das Klassenobjekt std::string iterierbar ist, können wir beliebige bereichsbasierte STL-Funktionen darauf aufrufen. In diesem Fall verwenden wir für jeden String die Funktion std::sort aus den STL-Algorithmen. Hier verwenden wir die einfachste Überladung der Funktion std::sort, die zwei Iteratorargumente benötigt, um den Bereich zu durchqueren und die Elemente standardmäßig in nicht absteigender Reihenfolge zu sortieren.

#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 << "; " << endl;
  }
  cout << endl;
}

int main() {
  vector<string> vec1 = {"algorithms library", "occurrences",
                         "implementation-specific", "contribute",
                         "specialization"};

  for (auto &item : vec1) {
    sort(item.begin(), item.end());
  }
  printVector(vec1);

  return EXIT_SUCCESS;
}

Ausgabe:

aabghiillmorrrsty;
ccceenorrsu;
-acceeefiiiilmmnnoppstt;
bceinorttu;
aaceiiilnopstz;

Alternativ können wir die benutzerdefinierte Komparatorfunktion an den std::sort-Algorithmus übergeben, um die Elemente entsprechend zu sortieren. Beachten Sie, dass der Funktionsprototyp folgende Form haben sollte: bool cmp(const Type1 &a, const Type2 &b);. Im folgenden Beispielcode verwenden wir den Lambda-Ausdruck, um die Sortierreihenfolge in absteigend umzukehren.

#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 << "; " << endl;
  }
  cout << endl;
}

int main() {
  vector<string> vec1 = {"algorithms library", "occurrences",
                         "implementation-specific", "contribute",
                         "specialization"};

  for (auto &item : vec1) {
    sort(item.begin(), item.end(), [](auto &c1, auto &c2) { return c1 > c2; });
  }
  printVector(vec1);

  return EXIT_SUCCESS;
}

Ausgabe:

ytsrrromlliihgbaa ;
usrroneeccc;
ttspponnmmliiiifeeecca-;
uttroniecb;
ztsponliiiecaa;

Verwenden Sie den Wrapper für benutzerdefinierte Funktionen, um die Zeichenkette in C++ zu sortieren

Ein auffälliger Fehler der vorherigen Lösung besteht darin, dass die Interpunktion und der Abstand von Zeichen nicht von den gültigen alphanumerischen Zeichen unterschieden werden können. Wir können also eine separate Funktion implementieren, bei der wir alle Satz- und Leerzeichen aus dem angegebenen string-Objekt verwerfen und dann den std::sort-Algorithmus aufrufen, um die Sortieroperation durchzuführen. Der Entfernungsvorgang erfolgt mit dem Idiom erase-remove_if, das einen Lambda-Ausdruck benötigt, um den Typ jedes Zeichens zu überprüfen. Die Funktionen isspace und ispunct werden in der Header-Datei <locale> verwendet.

#include <algorithm>
#include <iostream>
#include <locale>
#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 << "; " << endl;
  }
  cout << endl;
}

void sortStringChars(string &s) {
  s.erase(std::remove_if(
              s.begin(), s.end(),
              [](auto &c) { return std::isspace(c) || std::ispunct(c); }),
          s.end());
  sort(s.begin(), s.end());
}

int main() {
  vector<string> vec1 = {"algorithms library", "occurrences",
                         "implementation-specific", "contribute",
                         "specialization"};

  for (auto &item : vec1) {
    sortStringChars(item);
  }
  printVector(vec1);

  return EXIT_SUCCESS;
}

Ausgabe:

aabghiillmorrrsty;
ccceenorrsu;
acceeefiiiilmmnnoppstt;
bceinorttu;
aaceiiilnopstz;