Classificar uma sequência de caracteres em C++

Jinku Hu 12 outubro 2023
  1. Use o algoritmo std::sort para classificar a string de caracteres em C++
  2. Use o wrapper de função personalizada para classificar a sequência de caracteres em C++
Classificar uma sequência de caracteres em C++

Este guia explicará vários métodos de como classificar uma string de caracteres em C++.

Use o algoritmo std::sort para classificar a string de caracteres em C++

Neste artigo, assumimos que a sequência de caracteres é armazenada em um objeto std::string. Como o objeto de classe std::string é iterável, podemos chamar nele qualquer função STL baseada em intervalo. Neste caso, usamos a função std::sort dos algoritmos STL em cada string. Aqui, utilizamos a sobrecarga mais simples da função std::sort, que usa dois argumentos de iterador para percorrer o intervalo e classificar os elementos por padrão em ordem não 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;
}

Resultado:

aabghiillmorrrsty;
ccceenorrsu;
- acceeefiiiilmmnnoppstt;
bceinorttu;
aaceiiilnopstz;

Alternativamente, podemos passar a função de comparação personalizada para o algoritmo std::sort para classificar os elementos de acordo. Observe que o protótipo da função deve ter o seguinte formato: bool cmp(const Type1 &a, const Type2 &b);. No código de exemplo a seguir, utilizamos a expressão lambda para inverter a ordem de classificação para 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;
}

Resultado:

ytsrrromlliihgbaa;
usrroneeccc;
ttspponnmmliiiifeeecca - ;
uttroniecb;
ztsponliiiecaa;

Use o wrapper de função personalizada para classificar a sequência de caracteres em C++

Uma falha perceptível da solução anterior é que ela não consegue distinguir a pontuação e o espaçamento dos caracteres dos caracteres alfanuméricos válidos. Portanto, podemos implementar uma função separada onde descartamos todos os caracteres de pontuação e espaço do objeto string fornecido e, em seguida, chamamos o algoritmo std::sort para conduzir a operação de classificação. A operação de remoção é feita usando o idioma erase-remove_if, que usa uma expressão lambda para verificar o tipo de cada caractere. As funções isspace e ispunct são utilizadas incluídas no arquivo de cabeçalho <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;
}

Resultado:

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

Artigo relacionado - C++ String