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++ -
Use o algoritmo
std::sort
com expressão Lambda para classificar vetor de pares por valores de segundo elemento em C++ -
Use o algoritmo
std::sort
com uma função personalizada para classificar o 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};
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