Ordenar un vector de pares en C++

Jinku Hu 12 octubre 2023
  1. Utilice el algoritmo std::sort para ordenar el vector de pares por los valores del primer elemento en C++
  2. Utilice el algoritmo std::sort con expresión Lambda para ordenar el vector de pares por valores del segundo elemento en C++
  3. Utilice el algoritmo std::sort con una función personalizada para ordenar vectores de pares en C++
Ordenar un vector de pares en C++

Este artículo explicará cómo ordenar un vector de pares en C++.

Utilice el algoritmo std::sort para ordenar el vector de pares por los valores del primer elemento en C++

Los pares se proporcionan como una clase separada en la biblioteca de plantillas estándar de C++. Implementa un tipo para almacenar dos objetos heterogéneos como una sola unidad. El algoritmo std::pair es esencialmente una estructura de datos similar a una tupla con solo dos elementos.

Un objeto de par se declara con dos parámetros de plantilla que especifican el tipo de cada elemento. Podemos declarar un vector de objetos pair colocando la declaración de par como un parámetro de plantilla de vector. Un vector de pares se puede inicializar con una lista de inicializadores pasando cada par con llaves separadas, como se demuestra en el siguiente fragmento de código.

Podemos ordenar el vector de pares utilizando el algoritmo de ordenación genérico proporcionado por STL. La función std::sort toma dos iteradores del rango a ordenar y reordena los elementos en orden no descendente por defecto. En el caso de pares, el vector se ordena por el primer 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;
}

Producción :

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

Utilice el algoritmo std::sort con expresión Lambda para ordenar el vector de pares por valores del segundo elemento en C++

Alternativamente, podemos ordenar el vector de pares dado por los valores del segundo elemento si pasamos un objeto de función de comparación opcional al algoritmo std::sort. En este caso, utilizamos una expresión lambda para formar un objeto de función y pasarlo como el tercer argumento de la llamada a la función sort. Tenga en cuenta que este es esencialmente el método para definir cualquier rutina de comparación personalizada para los elementos del 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;
}

Producción :

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

Utilice el algoritmo std::sort con una función personalizada para ordenar vectores de pares en C++

Otro método para pasar una función de comparación al algoritmo std::sort es definir una función separada en la forma de bool cmp(const Type1 &a, const Type2 &b). Generalmente, std::sort tiene una complejidad de tiempo de ejecución de O(nlogn).

El siguiente ejemplo define una función sortPairs que compara los primeros elementos de cada par. Sin embargo, puede definir una función de comparación más compleja para los pares que almacenan objetos de clase personalizados o cuando se deben evaluar varios miembros de datos.

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

Producción :

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

Artículo relacionado - C++ Vector