Sortieren einer Zeichenkette in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie den std::sort-Algorithmus, um die Zeichenkette in C++ zu sortieren
  2. Verwenden Sie den Wrapper für benutzerdefinierte Funktionen, um die Zeichenkette in C++ zu sortieren
Sortieren einer Zeichenkette in C++

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;
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++ String