Classificar um vetor de pares em C++

Jinku Hu 12 outubro 2023
  1. Use o algoritmo std::sort para classificar o vetor de pares pelos valores do primeiro elemento em C++
  2. Use o algoritmo std::sort com expressão Lambda para classificar vetor de pares por valores de segundo elemento em C++
  3. Use o algoritmo std::sort com uma função personalizada para classificar o vetor de pares em C++
Classificar um vetor de pares em C++

Este artigo explicará como classificar um vetor de pares em C++.

Use o algoritmo std::sort para classificar o vetor de pares pelos valores do primeiro elemento em C++

Os pares são fornecidos como uma classe separada na biblioteca de modelos padrão C++. Ele implementa um tipo para armazenar dois objetos heterogêneos como uma única unidade. O algoritmo std::pair é essencialmente uma estrutura de dados tipo tupla com apenas dois elementos.

Um objeto de par é declarado com dois parâmetros de modelo que especificam o tipo de cada elemento. Podemos declarar um vetor de objetos pair colocando a declaração do par como um parâmetro do modelo de vetor. Um vetor de pares pode ser inicializado com uma lista de inicializadores passando cada par com colchetes separados, conforme demonstrado no fragmento de código a seguir.

Podemos classificar o vetor de pares usando o algoritmo de classificação genérico fornecido pela STL. A função std::sort leva dois iteradores do intervalo a ser classificado e reorganiza os elementos em ordem não decrescente por padrão. No caso de pares, o vetor é classificado pelo primeiro elemento de cada par.

#include <iostream>
#include <vector>

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

template <typename T>
void printVector(vector<T> &vec) {
  for (const auto &item : vec) {
    cout << "{" << item.first << "," << item.second << "}"
         << "; ";
  }
  cout << endl;
}

int main() {
  vector<pair<int, string>> vec1 = {
      {12, "eleven"}, {32, "thirty-two"}, {6, "six"}, {43, "forty-three"}};

  cout << "vec1: ";
  printVector(vec1);

  std::sort(vec1.begin(), vec1.end());

  cout << "vec1: ";
  printVector(vec1);

  return EXIT_SUCCESS;
}

Resultado:

vec1 : {12, eleven};
{32, thirty - two};
{6, six};
{43, forty - three};
vec1 : {6, six};
{12, eleven};
{32, thirty - two};
{43, forty - three};

Use o algoritmo std::sort com expressão Lambda para classificar vetor de pares por valores de segundo elemento em C++

Alternativamente, podemos classificar o dado vetor de pares pelos valores do segundo elemento se passarmos um objeto de função de comparação opcional para o algoritmo std::sort. Nesse caso, utilizamos uma expressão lambda para formar um objeto de função e passá-lo como o terceiro argumento da chamada de função sort. Observe que este é essencialmente o método para definir qualquer rotina de comparação personalizada para os elementos do par.

#include <iostream>
#include <vector>

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

template <typename T>
void printVector(vector<T> &vec) {
  for (const auto &item : vec) {
    cout << "{" << item.first << "," << item.second << "}"
         << "; ";
  }
  cout << endl;
}

int main() {
  vector<pair<int, string>> vec1 = {
      {12, "eleven"}, {32, "thirty-two"}, {6, "six"}, {43, "forty-three"}};

  cout << "vec1: ";
  printVector(vec1);

  std::sort(vec1.begin(), vec1.end(),
            [](const auto &x, const auto &y) { return x.second < y.second; });

  cout << "vec1: ";
  printVector(vec1);
  cout << endl;

  return EXIT_SUCCESS;
}

Resultado:

vec1 : {12, eleven};
{32, thirty - two};
{6, six};
{43, forty - three};
vec1 : {12, eleven};
{43, forty - three};
{6, six};
{32, thirty - two};

Use o algoritmo std::sort com uma função personalizada para classificar o vetor de pares em C++

Outro método para passar uma função de comparação para o algoritmo std::sort é definir uma função separada na forma de bool cmp(const Type1 &a, const Type2 &b). Geralmente, std::sort tem complexidade de tempo de execução O(nlogn).

O exemplo a seguir define uma função sortPairs que compara os primeiros elementos de cada par. Embora, você possa definir uma função de comparação mais complexa para os pares que armazenam objetos de classe personalizados ou quando vários membros de dados devem ser avaliados.

#include <iostream>
#include <vector>

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

template <typename T>
void printVector(vector<T> &vec) {
  for (const auto &item : vec) {
    cout << "{" << item.first << "," << item.second << "}"
         << "; ";
  }
  cout << endl;
}

bool sortPairs(const pair<int, string> &x, const pair<int, string> &y) {
  return x.first > y.first;
}

int main() {
  vector<pair<int, string>> vec1 = {
      {12, "eleven"}, {32, "thirty-two"}, {6, "six"}, {43, "forty-three"}};

  cout << "vec1: ";
  printVector(vec1);

  std::sort(vec1.begin(), vec1.end(), sortPairs);

  cout << "vec1: ";
  printVector(vec1);
  cout << endl;

  return EXIT_SUCCESS;
}

Resultado:

vec1 : {12, eleven};
{32, thirty - two};
{6, six};
{43, forty - three};
vec1 : {43, forty - three};
{32, thirty - two};
{12, eleven};
{6, six};
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