Trier le vecteur en C++

Jinku Hu 12 octobre 2023
  1. Utilisez l’algorithme std::sort pour trier les éléments vectoriels
  2. Utilisez la fonction std::sort avec l’expression Lambda pour trier le vecteur de struct
  3. Utilisez la fonction std::sort avec une fonction personnalisée pour trier le vecteur de struct
Trier le vecteur en C++

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

Article connexe - C++ Vector