Vector de Ordenação em C++
-
Utilizar o
std::sort
Algoritmo para Ordenar Elementos Vectoriais -
Use a função
std::sort
com expressão Lambda para classificar o vetor destruct
-
Use a função
std::sort
com função personalizada para classificar o vetor destruct
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;
}
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