Algoritmos STL en C++

Jinku Hu 12 octubre 2023
  1. Utilice el algoritmo std::sort para ordenar rangos vectoriales genéricos en C++
  2. Utilice el algoritmo std::reverse para invertir el orden de los elementos en C++
  3. Utilice el algoritmo std::accumulate para calcular la suma de elementos en un rango en C++
  4. Utilice el algoritmo std::count para contar el número de elementos que satisfacen los criterios específicos en C++
Algoritmos STL en C++

Este artículo presentará varias funciones de la biblioteca de algoritmos STL en C++.

Utilice el algoritmo std::sort para ordenar rangos vectoriales genéricos en C++

std::sort es uno de los algoritmos más utilizados en STL. Tiene múltiples sobrecargas, la más simple de las cuales acepta dos iteradores que cumplen con los requisitos de LegacyRandomAccessIterator y ordena los elementos en orden no descendente. Esto último se dice porque no se garantiza que se conserve el orden de elementos iguales.

std::sort se usa comúnmente en rangos de vector. El siguiente fragmento de código demuestra el uso como tal. El algoritmo puede tomar opcionalmente la función de comparación, que se utilizará para evaluar pares de elementos y ordenar el rango correspondientemente.

El siguiente ejemplo muestra una línea donde el objeto de función STL - std::greater se pasa como función de comparación. Alternativamente, se puede definir un objeto de función personalizado o especificar la expresión lambda directamente como el tercer parámetro de std::sort.

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

template <typename T>
void printRange(std::vector<T> v) {
  for (const auto &item : v) {
    cout << item << ", ";
  }
  cout << endl;
}

int main() {
  std::vector<int> v1 = {1, 3, 5, 11, 9, 10, 13, 20};

  std::sort(v1.begin(), v1.end());
  printRange(v1);

  std::sort(v1.begin(), v1.end(), std::greater<>());
  printRange(v1);

  std::sort(v1.begin(), v1.end(), [](int a, int b) { return (a - 2) != b; });
  printRange(v1);

  return EXIT_SUCCESS;
}

Producción :

1, 3, 5, 9, 10, 11, 13, 20,
20, 13, 11, 10, 9, 5, 3, 1,
1, 3, 5, 9, 10, 11, 13, 20

Utilice el algoritmo std::reverse para invertir el orden de los elementos en C++

std::reverse se puede utilizar para invertir el contenido de los contenedores de secuencia como vector, list o deque. La función acepta dos parámetros de iterador y puede operar en cualquier tipo genérico. El siguiente ejemplo de código muestra dos escenarios en los que el vector de números enteros y la “lista” de cadenas se invierten. También ordenamos el objeto list usando la función miembro sort antes de invocar el algoritmo std::reverse. Tenga en cuenta que el algoritmo std::sort no funciona en el contenedor std::list.

#include <algorithm>
#include <iostream>
#include <list>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::list;
using std::string;
using std::vector;

template <typename T>
void printRange(std::vector<T> v) {
  for (const auto &item : v) {
    cout << item << ", ";
  }
  cout << endl;
}

template <typename T>
void printRange(std::list<T> v) {
  for (const auto &item : v) {
    cout << item << ", ";
  }
  cout << endl;
}

int main() {
  std::vector<int> v1 = {1, 3, 5, 11, 9, 10, 13, 20};
  std::list<string> l1 = {"htop", "wtop", "rtop", "ktop", "ktop", "ptop"};

  std::reverse(v1.begin(), v1.end());
  printRange(v1);

  l1.sort();
  std::reverse(l1.begin(), l1.end());
  printRange(l1);

  return EXIT_SUCCESS;
}

Producción :

20, 13, 10, 9, 11, 5, 3, 1,
wtop, rtop, ptop, ktop, ktop, htop,

Utilice el algoritmo std::accumulate para calcular la suma de elementos en un rango en C++

std::accumulate es parte de algoritmos numéricos que se pueden utilizar para realizar operaciones aritméticas comunes en cada elemento del rango dado. En este caso, el algoritmo dado calcula la suma total de cada elemento en el rango. std::accumulate tiene dos sobrecargas, la primera de las cuales toma los dos iteradores que denotan el rango en sí y el valor init, que representa el valor inicial para la suma. La segunda sobrecarga puede tomar opcionalmente un objeto de función como el cuarto parámetro aplicado en lugar de la suma.

#include <algorithm>
#include <iostream>
#include <numeric>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

int main() {
  std::vector<int> v1 = {1, 3, 5, 11, 9, 10, 13, 20};

  auto sum = std::accumulate(v1.begin(), v1.end(), 0);
  cout << "Sum of 'v1' vector = " << sum << endl;

  sum = std::accumulate(v1.begin(), v1.end(), 1, std::multiplies());
  cout << "Accumulate of 'v1' vector = " << sum << endl;

  return EXIT_SUCCESS;
}

Producción :

Sum of 'v1' vector = 72
Accumulate of 'v1' vector = 3861000

Utilice el algoritmo std::count para contar el número de elementos que satisfacen los criterios específicos en C++

La función std::count es un método útil para contar elementos específicos en el rango dado. Es decir, podemos pasar los iteradores de rango y el valor para que coincidan con todos los elementos que son iguales al valor dado. Otra sobrecarga puede aceptar un predicado unario que devuelve evaluar las coincidencias válidas y el algoritmo recupera el número de recuento correspondiente. En el siguiente ejemplo, especificamos una expresión lambda para contar números pares en el objeto vector.

#include <algorithm>
#include <iostream>
#include <list>
#include <numeric>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

int main() {
  std::vector<int> v1 = {1, 3, 5, 11, 9, 10, 13, 20};

  auto count_10 = std::count(v1.begin(), v1.end(), 10);
  cout << count_10 << " occurrences of number 10" << endl;

  auto count_even =
      std::count_if(v1.begin(), v1.end(), [](int i) { return i % 2 == 0; });
  cout << count_even << " even numbers in 'v1' vector" << endl;

  return EXIT_SUCCESS;
}

Producción :

1 occurrences of number 10
2 even numbers in 'v1' vector
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++ Algorithm