Ordina una stringa di caratteri in C++

Jinku Hu 12 ottobre 2023
  1. Usa l’algoritmo std::sort per ordinare la stringa di caratteri in C++
  2. Usa il wrapper di funzioni personalizzate per ordinare la stringa di caratteri in C++
Ordina una stringa di caratteri in C++

Questa guida spiegherà diversi metodi su come ordinare una stringa di caratteri in C++.

Usa l’algoritmo std::sort per ordinare la stringa di caratteri in C++

In questo articolo, assumiamo che la sequenza di caratteri sia memorizzata in un oggetto std::string. Poiché l’oggetto di classe std::string è iterabile, possiamo chiamare su di esso qualsiasi funzione STL basata sull’intervallo. In questo caso, utilizziamo la funzione std::sort degli algoritmi STL su ogni stringa. Qui, utilizziamo l’overload più semplice della funzione std::sort, che accetta due argomenti dell’iteratore per attraversare l’intervallo e ordinare gli elementi per impostazione predefinita in ordine non decrescente.

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

Produzione:

aabghiillmorrrsty;
ccceenorrsu;
- acceeefiiiilmmnnoppstt;
bceinorttu;
aaceiiilnopstz;

In alternativa, possiamo passare la funzione comparatore personalizzato all’algoritmo std::sort per ordinare gli elementi di conseguenza. Nota che il prototipo della funzione dovrebbe avere la seguente forma: bool cmp(const Type1 &a, const Type2 &b);. Nel seguente codice di esempio, utilizziamo l’espressione lambda per invertire l’ordinamento in decrescente.

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

Produzione:

ytsrrromlliihgbaa;
usrroneeccc;
ttspponnmmliiiifeeecca - ;
uttroniecb;
ztsponliiiecaa;

Usa il wrapper di funzioni personalizzate per ordinare la stringa di caratteri in C++

Un difetto evidente della soluzione precedente è che non riesce a distinguere la punteggiatura e la spaziatura dei caratteri dai caratteri alfanumerici validi. Quindi, possiamo implementare una funzione separata in cui scartiamo tutti i caratteri di punteggiatura e spazio dall’oggetto stringa dato e quindi chiamiamo l’algoritmo std::sort per condurre l’operazione di ordinamento. L’operazione di rimozione viene eseguita utilizzando l’idioma erase-remove_if, che utilizza un’espressione lambda per verificare il tipo di ciascun carattere. Le funzioni isspace e ispunct sono utilizzate incluse nel file di intestazione <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;
}

Produzione:

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

Articolo correlato - C++ String