HOWTO · C++
Trier une chaîne de caractères en C++
Cet article montre comment trier une chaîne de caractères en C++.
Sur cette page
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;