Ordina un vettore di coppie in C++
-
Usa l’algoritmo
std::sort
per ordinare il vettore di coppie in base ai valori del primo elemento in C++ -
Utilizzare l’algoritmo
std::sort
con espressione lambda per ordinare il vettore di coppie in base ai valori del secondo elemento in C++ -
Usa l’algoritmo
std::sort
con una funzione personalizzata per ordinare il vettore di coppie in C++
Questo articolo spiegherà come ordinare un vettore di coppie in C++.
Usa l’algoritmo std::sort
per ordinare il vettore di coppie in base ai valori del primo elemento in C++
Le coppie vengono fornite come classe separata nella libreria di modelli standard C++. Implementa un tipo per memorizzare due oggetti eterogenei come una singola unità. L’algoritmo std::pair
è essenzialmente una struttura dati simile a una tupla con solo due elementi.
Un oggetto coppia viene dichiarato con due parametri del modello che specificano il tipo di ogni elemento. Possiamo dichiarare un vettore di oggetti pair
ponendo la dichiarazione pair come parametro del template vettoriale. Un vettore di coppie può essere inizializzato con un elenco di inizializzatori passando ogni coppia con parentesi graffe separate, come illustrato nel seguente frammento di codice.
Possiamo ordinare il vettore di coppie utilizzando l’algoritmo di ordinamento generico fornito da STL. La funzione std::sort
accetta due iteratori dell’intervallo da ordinare e riorganizza gli elementi in ordine non decrescente per impostazione predefinita. Nel caso delle coppie, il vettore è ordinato in base al primo elemento di ciascuna coppia.
#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;
}
Produzione:
vec1 : {12, eleven};
{32, thirty - two};
{6, six};
{43, forty - three};
vec1 : {6, six};
{12, eleven};
{32, thirty - two};
{43, forty - three};
Utilizzare l’algoritmo std::sort
con espressione lambda per ordinare il vettore di coppie in base ai valori del secondo elemento in C++
In alternativa, possiamo ordinare il vettore di coppie dato in base ai valori del secondo elemento se passiamo un oggetto funzione di confronto opzionale all’algoritmo std::sort
. In questo caso, utilizziamo un’espressione lambda per formare un oggetto funzione e passarlo come terzo argomento della chiamata di funzione sort
. Si noti che questo è essenzialmente il metodo per definire qualsiasi routine di confronto personalizzata per gli elementi della coppia.
#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;
}
Produzione:
vec1 : {12, eleven};
{32, thirty - two};
{6, six};
{43, forty - three};
vec1 : {12, eleven};
{43, forty - three};
{6, six};
{32, thirty - two};
Usa l’algoritmo std::sort
con una funzione personalizzata per ordinare il vettore di coppie in C++
Un altro metodo per passare una funzione di confronto all’algoritmo std::sort
consiste nel definire una funzione separata nella forma di bool cmp(const Type1 &a, const Type2 &b)
. Generalmente, std::sort
ha una complessità di tempo di esecuzione O(nlogn)
.
L’esempio seguente definisce una funzione sortPairs
che confronta i primi elementi di ogni coppia. Tuttavia, è possibile definire una funzione di confronto più complessa per le coppie che archiviano oggetti di classe personalizzati o quando è necessario valutare più membri di dati.
#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;
}
Produzione:
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