Ordina un vettore di coppie in C++

Jinku Hu 12 ottobre 2023
  1. Usa l’algoritmo std::sort per ordinare il vettore di coppie in base ai valori del primo elemento in C++
  2. Utilizzare l’algoritmo std::sort con espressione lambda per ordinare il vettore di coppie in base ai valori del secondo elemento in C++
  3. Usa l’algoritmo std::sort con una funzione personalizzata per ordinare il vettore di coppie in C++
Ordina un 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};
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Articolo correlato - C++ Vector