Algoritmos (C++ moderno)

 

Para obtener la documentación más reciente de Visual Studio 2017 RC, consulte Documentación de Visual Studio 2017 RC.

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 );  
  

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.

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>.

Aquí está otra vez C++
Referencia de lenguaje C++
Biblioteca estándar de C++

Mostrar: