Ordenar vector en C++

Jinku Hu 12 octubre 2023
  1. Utilice el algoritmo std::sort para ordenar elementos vectoriales
  2. Utilice la función std::sort con expresión Lambda para ordenar el vector de struct s
  3. Utilice la función std::sort con función personalizada para ordenar el vector de struct
Ordenar vector en C++

Este artículo demostrará varios métodos de cómo ordenar un vector en C++.

Utilice el algoritmo std::sort para ordenar elementos vectoriales

La función std::sort implementa un algoritmo genérico para trabajar con diferentes objetos y ordena los elementos dados en el rango usando la función comparadora pasada como tercer argumento. Tenga en cuenta que la función se puede utilizar sin el tercer argumento, en cuyo caso los elementos se ordenan mediante operador <. El siguiente código de ejemplo demuestra un escenario de este tipo, donde el elemento es de tipo cadena, que tiene una función miembro operador < y se puede ordenar con el comparador predeterminado.

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

Producción :

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

Utilice la función std::sort con expresión Lambda para ordenar el vector de struct s

Alternativamente, se puede construir un objeto de función comparador personalizado con una expresión lambda para ordenar las estructuras definidas por el usuario. En este caso, tenemos una struct cpu con diferentes miembros de datos, y se construyen dos llamadas de sort pasando los objetos de función que comparan miembros value o property1, respectivamente.

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

Utilice la función std::sort con función personalizada para ordenar el vector de struct

Tenga en cuenta que el método anterior es bastante inflexible para ser utilizado en bases de código más grandes y puede hacer que el código sea bastante voluminoso si la función de comparación es complicada. Otra solución sería implementar funciones de comparación como miembros de struct y declararlas como static para que sean accesibles a través del operador de alcance. Además, estas funciones deben devolver un valor bool y solo tener dos parámetros.

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

Artículo relacionado - C++ Vector