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++ -
Utilice el algoritmo
std::sort
con expresión Lambda para ordenar el vector de pares por valores del segundo elemento en C++ -
Utilice el algoritmo
std::sort
con una función personalizada para ordenar vectores 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};
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