Ordina vettore in C++
-
Usa l’algoritmo
std::sort
per ordinare gli elementi vettoriali -
Usa la funzione
std::sort
con espressione Lambda per ordinare il vettore distruct
-
Usa la funzione
std::sort
con funzione personalizzata per ordinare il vettore distruct
Questo articolo illustrerà più metodi su come ordinare un vettore in C++.
Usa l’algoritmo std::sort
per ordinare gli elementi vettoriali
La funzione std::sort
implementa un algoritmo generico per lavorare con oggetti diversi e ordina gli elementi dati nell’intervallo usando la funzione di confronto passata come terzo argomento. Si noti che la funzione può essere utilizzata senza il terzo argomento, nel qual caso gli elementi vengono ordinati utilizzando operatore <
. Il codice di esempio seguente mostra un tale scenario, in cui l’elemento è di tipo stringa, che ha la funzione membro operator<
e può essere ordinato con il comparatore predefinito.
#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;
}
Produzione:
highway, song, world, death, mom, historian, menu, woman,
death, highway, historian, menu, mom, song, woman, world,
Usa la funzione std::sort
con espressione Lambda per ordinare il vettore di struct
In alternativa, è possibile costruire un oggetto funzione di confronto personalizzato con un’espressione lambda per ordinare le strutture definite dall’utente. In questo caso, abbiamo una struct cpu
con membri dati differenti, e due chiamate sort
sono costruite passando gli oggetti funzione che confrontano i membri value
o property1
, rispettivamente.
#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;
}
Usa la funzione std::sort
con funzione personalizzata per ordinare il vettore di struct
Si noti che il metodo precedente è abbastanza rigido per essere utilizzato in basi di codice più grandi e può rendere il codice piuttosto ingombrante se la funzione di confronto è complicata. Un’altra soluzione sarebbe implementare le funzioni di confronto come membri struct
e dichiararli come static
per essere accessibili tramite l’operatore di ambito. Inoltre, queste funzioni devono restituire un valore bool
e avere solo due parametri.
#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