Ordina vettore in C++

Jinku Hu 12 ottobre 2023
  1. Usa l’algoritmo std::sort per ordinare gli elementi vettoriali
  2. Usa la funzione std::sort con espressione Lambda per ordinare il vettore di struct
  3. Usa la funzione std::sort con funzione personalizzata per ordinare il vettore di struct
Ordina vettore in C++

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;
}
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