HOWTO · C++

Trier le vecteur en C++

Cet article présente comment trier les vecteurs en C++

Sur cette page

Cet article présente plusieurs méthodes de tri d’un vecteur en C++.

Utilisez l’algorithme std::sort pour trier les éléments vectoriels

La fonction std::sort implémente un algorithme générique pour travailler avec différents objets et trie les éléments donnés dans la plage en utilisant la fonction de comparaison passée comme troisième argument. Notez que la fonction peut être utilisée sans le troisième argument, auquel cas les éléments sont triés à l’aide de operator<. L’exemple de code suivant illustre un tel scénario, où l’élément est de type string, qui a la fonction membre operator< et peut être trié avec le comparateur par défaut.

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

Production:

highway, song, world, death, mom, historian, menu, woman,
death, highway, historian, menu, mom, song, woman, world,

Utilisez la fonction std::sort avec l’expression Lambda pour trier le vecteur de struct

Alternativement, un objet fonction de comparateur personnalisé peut être construit avec une expression lambda pour trier les structures définies par l’utilisateur. Dans ce cas, nous avons une struct cpu avec des données membres différents, et deux appels sort sont construits en passant les objets fonction qui comparent respectivement les membres value ou property1.

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

Utilisez la fonction std::sort avec une fonction personnalisée pour trier le vecteur de struct

Notez que la méthode précédente est assez rigide pour être utilisée dans des bases de code plus grandes et peut rendre le code assez volumineux si la fonction de comparaison est compliquée. Une autre solution serait d’implémenter des fonctions de comparaison en tant que membres struct et de les déclarer comme statiques pour être accessibles via l’opérateur scope. De plus, ces fonctions doivent renvoyer une valeur booléenne et n’avoir que deux paramètres.

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