Trier une chaîne de caractères en C++

Jinku Hu 12 octobre 2023
  1. Utilisez l’algorithme std::sort pour trier la chaîne de caractères en C++
  2. Utilisez le wrapper de fonction personnalisée pour trier la chaîne de caractères en C++
Trier une chaîne de caractères en C++

Ce guide expliquera plusieurs méthodes pour trier une chaîne de caractères en C++.

Utilisez l’algorithme std::sort pour trier la chaîne de caractères en C++

Dans cet article, nous supposons que la séquence de caractères est stockée dans un objet std::string. Puisque l’objet de classe std::string est itérable, nous pouvons appeler n’importe quelle fonction STL basée sur une plage. Dans ce cas, nous utilisons la fonction std::sort des algorithmes STL sur chaque chaîne. Ici, nous utilisons la surcharge la plus simple de la fonction std::sort, qui prend deux arguments d’itérateur pour parcourir la plage et trier les éléments par défaut dans l’ordre non décroissant.

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

Production:

aabghiillmorrrsty;
ccceenorrsu;
- acceeefiiiilmmnnoppstt;
bceinorttu;
aaceiiilnopstz;

Alternativement, nous pouvons passer la fonction de comparateur personnalisé à l’algorithme std::sort pour trier les éléments en conséquence. Notez que le prototype de fonction doit avoir la forme suivante : bool cmp(const Type1 &a, const Type2 &b);. Dans l’exemple de code suivant, nous utilisons l’expression lambda pour inverser l’ordre de tri en ordre décroissant.

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

Production:

ytsrrromlliihgbaa;
usrroneeccc;
ttspponnmmliiiifeeecca - ;
uttroniecb;
ztsponliiiecaa;

Utilisez le wrapper de fonction personnalisée pour trier la chaîne de caractères en C++

Un défaut notable de la solution précédente est qu’elle ne peut pas distinguer la ponctuation et l’espacement des caractères des caractères alphanumériques valides. Ainsi, nous pouvons implémenter une fonction distincte dans laquelle nous supprimons tous les caractères de ponctuation et d’espace de l’objet string donné, puis appelons l’algorithme std::sort pour effectuer l’opération de tri. L’opération de suppression se fait à l’aide de l’idiome erase-remove_if, qui prend une expression lambda pour vérifier le type de chaque caractère. Les fonctions isspace et ispunct sont utilisées depuis le fichier d’en-tête <locale>.

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

Production:

aabghiillmorrrsty;
ccceenorrsu;
acceeefiiiilmmnnoppstt;
bceinorttu;
aaceiiilnopstz;
Auteur: 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

Article connexe - C++ String