Vector de Ordenação em C++

Jinku Hu 12 outubro 2023
  1. Utilizar o std::sort Algoritmo para Ordenar Elementos Vectoriais
  2. Use a função std::sort com expressão Lambda para classificar o vetor de struct
  3. Use a função std::sort com função personalizada para classificar o vetor de struct
Vector de Ordenação em C++

Este artigo demonstrará vários métodos de como ordenar um vetor em C++.

Utilizar o std::sort Algoritmo para Ordenar Elementos Vectoriais

A função std::sort implementa um algoritmo genérico para trabalhar com objetos diferentes e classifica os elementos fornecidos no intervalo usando a função de comparador passada como o terceiro argumento. Observe que a função pode ser usada sem o terceiro argumento, caso em que os elementos são ordenados usando operador <. O código de exemplo a seguir demonstra tal cenário, onde o elemento é do tipo string, que possui a função de membro operator< e pode ser classificado com o comparador padrão.

#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 << ", ";
  }
  cout << endl;
}

int main() {
  vector<string> vec1 = {"highway", "song",      "world", "death",
                         "mom",     "historian", "menu",  "woman"};
  printVector(vec1);
  sort(vec1.begin(), vec1.end());
  printVector(vec1);

  return EXIT_SUCCESS;
}

Resultado:

highway, song, world, death, mom, historian, menu, woman,
death, highway, historian, menu, mom, song, woman, world,

Use a função std::sort com expressão Lambda para classificar o vetor de struct

Como alternativa, um objeto de função de comparador personalizado pode ser construído com uma expressão lambda para classificar as estruturas definidas pelo usuário. Nesse caso, temos uma struct cpu com diferentes membros de dados, e duas chamadas sort são construídas passando os objetos de função que comparam membros value ou property1, respectivamente.

#include <algorithm>
#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::sort;
using std::string;
using std::vector;

struct cpu {
  string property1;
  string property2;
  string property3;
  int value;
} typedef cpu;

void printVector(vector<cpu> &vec) {
  for (const auto &item : vec) {
    cout << item.property1 << " : " << item.property2 << " : " << item.property3
         << " : " << item.value << endl;
  }
  cout << endl;
}

int main() {
  vector<cpu> vec3 = {{"WMP", "GR", "33", 2023},
                      {"TPS", "US", "31", 2020},
                      {"EOM", "GB", "36", 2021},
                      {"AAW", "GE", "39", 2024}};

  printVector(vec3);
  sort(vec3.begin(), vec3.end(),
       [](cpu &x, cpu &y) { return x.value < y.value; });
  sort(vec3.begin(), vec3.end(),
       [](cpu &x, cpu &y) { return x.property1 < y.property1; });
  printVector(vec3);

  return EXIT_SUCCESS;
}

Use a função std::sort com função personalizada para classificar o vetor de struct

Observe que o método anterior é bastante inflexível para ser utilizado em bases de código maiores e pode tornar o código bastante volumoso se a função de comparação for complicada. Outra solução seria implementar funções de comparação como membros struct e declará-los como static para serem acessíveis por meio do operador de escopo. Além disso, essas funções devem retornar um valor bool e ter apenas dois parâmetros.

#include <algorithm>
#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::sort;
using std::string;
using std::vector;

struct cpu {
  string property1;
  string property2;
  string property3;
  int value;

 public:
  static bool compareCpusByValue(cpu &a, cpu &b) { return a.value < b.value; }

  static bool compareCpusByProperty1(cpu &a, cpu &b) {
    return a.property1 < b.property1;
  }
} typedef cpu;

void printVector(vector<cpu> &vec) {
  for (const auto &item : vec) {
    cout << item.property1 << " : " << item.property2 << " : " << item.property3
         << " : " << item.value << endl;
  }
  cout << endl;
}

int main() {
  vector<cpu> vec3 = {{"WMP", "GR", "33", 2023},
                      {"TPS", "US", "31", 2020},
                      {"EOM", "GB", "36", 2021},
                      {"AAW", "GE", "39", 2024}};

  printVector(vec3);
  sort(vec3.begin(), vec3.end(), cpu::compareCpusByProperty1);
  sort(vec3.begin(), vec3.end(), cpu::compareCpusByValue);
  printVector(vec3);

  return EXIT_SUCCESS;
}
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++ Vector