Compartir a través de


Algoritmos (C++ moderno)

Para una programación moderna de C++, recomendamos utilizar los algoritmos en la Biblioteca de plantillas estándar (STL). Aquí se describen algunos ejemplos importantes:

  • for_each, que es el algoritmo predeterminado de recorrido. (También transform para semántica fuera de contexto).

  • find_if, que es el algoritmo de búsqueda predeterminado.

  • sort, lower_bound y los otros algoritmos de ordenación y búsqueda predeterminados.

Para escribir un comparador, utilice < estricto y utilice lambdas con nombre si es posible.

auto comp = []( const widget& w1, const widget& w2 )
      { return w1.weight() < w2.weight(); }

sort( v.begin(), v.end(), comp );

auto i = lower_bound( v.begin(), v.end(), comp );

Bucles

Cuando sea posible, use bucles for basados en intervalos o llamadas de algoritmo, o ambos, en lugar de bucles escritos a mano. copy, transform, count_if, remove_if y otros como ellos son mucho mejor que bucles manuscritos porque su intención es obvia y facilitan la escritura de código sin faltas. Además, muchos algoritmos STL tienen optimizaciones de implementación que los hacen más eficaces.

En lugar del antiguo C++ así:

for( auto i = strings.begin(); i != strings.end(); ++i ) {
  :::
  :::
}

auto i = v.begin();

for( ; i != v.end(); ++i ) {
  if (*i > x && *i < y) break;
}

Utilice C++ moderno de esta forma:

for_each( begin(strings), end(strings), []( string& s ) {
  :::
  :::
} );
auto i = find_if( begin(v), end(v),  [=](int i) { return i > x && i < y; }  );

Bucles basados en intervalo

El bucle for basado en intervalos es una característica del lenguaje C++11, no un algoritmo de STL. Pero merece que se mencione en esta explicación sobre los bucles. Los bucles for basados en intervalos son una extensión de la palabra clave for y proporcionan una forma adecuada y eficaz de escribir bucles que iteran en un intervalo de valores. Los contenedores STL, cadenas y matrices de STL están listos para usar bucles for basados en intervalo. Para habilitar esta nueva sintaxis de iteración para el tipo definido por el usuario, agregue la siguiente compatibilidad:

  • Un método begin que devuelve un iterador al principio de la estructura y un método end que devuelve un iterador al final de la estructura.

  • Compatibilidad en el iterador con estos métodos: operator*, operator!= y operator++ (versión prefija).

Estos métodos pueden ser miembros o funciones independientes.

Números aleatorios

No es ningún secreto que la antigua función rand() de CRT tiene muchos defectos, que se han explicado en profundidad en la comunidad de C++. En C++ moderno, no tiene que encargarse de esas limitaciones ni tiene que inventar su propio generador de números aleatorios uniformemente distribuido, ya que las herramientas para crearlos rápida y fácilmente están disponibles en STL, como se muestra en <random>.

Vea también

Otros recursos

Aquí está otra vez C++ (C++ moderno)

Referencia de lenguaje C++

Referencia de biblioteca estándar de C++