stringtranslate.com

Biblioteca de plantillas estándar

La biblioteca de plantillas estándar ( STL ) es una biblioteca de software diseñada originalmente por Alexander Stepanov para el lenguaje de programación C++ que influyó en muchas partes de la biblioteca estándar de C++ . Proporciona cuatro componentes llamados algoritmos , contenedores , funciones e iteradores . [1]

STL proporciona un conjunto de clases comunes para C++, como contenedores y matrices asociativas , que se pueden usar con cualquier tipo integrado y con cualquier tipo definido por el usuario que admita algunas operaciones elementales (como copia y asignación). Los algoritmos STL son independientes de los contenedores, lo que reduce significativamente la complejidad de la biblioteca.

El STL logra sus resultados mediante el uso de plantillas . Este enfoque proporciona polimorfismo en tiempo de compilación que a menudo es más eficiente que el polimorfismo en tiempo de ejecución tradicional . Los compiladores de C++ modernos están optimizados para minimizar las penalizaciones por abstracción que surgen del uso intensivo de STL.

El STL fue creado como la primera biblioteca de algoritmos genéricos y estructuras de datos para C++, con cuatro ideas en mente: programación genérica , abstracción sin pérdida de eficiencia, el modelo de cálculo de Von Neumann , [2] y semántica de valores .

STL y la biblioteca estándar de C++ son dos entidades distintas. [3]

Historia

En noviembre de 1993, Alexander Stepanov presentó una biblioteca basada en programación genérica al comité ANSI/ISO para la estandarización de C++. La respuesta del comité fue abrumadoramente favorable y condujo a que Andrew Koenig solicitara una propuesta formal a tiempo para la reunión de marzo de 1994. El comité recibió varias solicitudes de cambios y extensiones y los miembros del comité se reunieron con Stepanov y Meng Lee para ayudar a resolver los detalles. Los requisitos para la extensión más importante ( contenedores asociativos ) debían demostrarse consistentes implementándolos completamente, una tarea que Stepanov delegó en David Musser . Una propuesta recibió la aprobación final en la reunión del comité ANSI/ISO de julio de 1994. Posteriormente, el documento 17 de Stepanov y Lee se incorporó al borrador del estándar ANSI/ISO C++ (1, partes de las cláusulas 17 a 27).

Las perspectivas de una pronta difusión generalizada del STL mejoraron considerablemente con la decisión de Hewlett-Packard de hacer que su implementación estuviera disponible gratuitamente en Internet en agosto de 1994. Esta implementación, desarrollada por Stepanov, Lee y Musser durante el proceso de estandarización, se convirtió en la base de Muchas implementaciones que ofrecen los proveedores de compiladores y bibliotecas en la actualidad.

Composición

Contenedores

El STL contiene contenedores de secuencias y contenedores asociativos. Los contenedores son objetos que almacenan datos. Los contenedores de secuencia estándar incluyen vector, dequey list. Los contenedores asociativos estándar son set, multiset, map, multimap, hash_set, hash_mapy hash_multiset. hash_multimapTambién existen adaptadores de contenedores queue , priority_queuey stack, que son contenedores con una interfaz específica, que utilizan otros contenedores como implementación.

Iteradores

El STL implementa cinco tipos diferentes de iteradores . Estos son iteradores de entrada (que solo se pueden usar para leer una secuencia de valores), iteradores de salida (que solo se pueden usar para escribir una secuencia de valores), iteradores directos (que se pueden leer, escribir y avanzar), iteradores bidireccionales (que son como iteradores hacia adelante, pero también pueden moverse hacia atrás) yiteradores de acceso aleatorio (que pueden moverse libremente cualquier número de pasos en una operación).

Un concepto fundamental de STL es un rango que es un par de iteradores que designan el comienzo y el final del cálculo, y la mayoría de las plantillas algorítmicas de la biblioteca que operan en estructuras de datos tienen interfaces que usan rangos. [6]

Es posible hacer que los iteradores bidireccionales actúen como iteradores de acceso aleatorio, por lo que se podría avanzar diez pasos simplemente avanzando un paso a la vez un total de diez veces. Sin embargo, tener distintos iteradores de acceso aleatorio ofrece ventajas de eficiencia. Por ejemplo, un vector tendría un iterador de acceso aleatorio, pero una lista solo tendría un iterador bidireccional.

Los iteradores son la característica principal que permite la generalidad del STL. Por ejemplo, se puede implementar un algoritmo para invertir una secuencia usando iteradores bidireccionales, y luego se puede usar la misma implementación en listas, vectores y deques . Los contenedores creados por el usuario solo tienen que proporcionar un iterador que implemente una de las cinco interfaces de iterador estándar, y todos los algoritmos proporcionados en STL se pueden usar en el contenedor.

Esta generalidad a veces también tiene un precio. Por ejemplo, realizar una búsqueda en un contenedor asociativo, como un mapa o un conjunto, puede ser mucho más lento utilizando iteradores que llamando a funciones miembro ofrecidas por el propio contenedor. Esto se debe a que los métodos de un contenedor asociativo pueden aprovechar el conocimiento de la estructura interna, que es opaca para los algoritmos que utilizan iteradores.

Algoritmos

En el STL se proporciona una gran cantidad de algoritmos para realizar actividades como búsqueda y clasificación, cada uno de los cuales se implementa para requerir un cierto nivel de iterador (y, por lo tanto, funcionará en cualquier contenedor que proporcione una interfaz mediante iteradores). Los algoritmos de búsqueda como binary_searchel lower_bounduso de búsqueda binaria y los algoritmos de clasificación similares requieren que el tipo de datos debe implementar un operador de comparación <o se debe especificar una función de comparación personalizada; dicho operador de comparación o función de comparación debe garantizar un orden débil estricto . Aparte de estos, se proporcionan algoritmos para crear un montón a partir de una variedad de elementos, generar permutaciones ordenadas lexicográficamente de una variedad de elementos, fusionar rangos ordenados y realizar unión , intersección y diferencia de rangos ordenados.

Functores

El STL incluye clases que sobrecargan el operador de llamada de función ( ). Las instancias de tales clases se denominan functores u objetos de función . Los functores permiten parametrizar el comportamiento de la función asociada (por ejemplo, a través de argumentos pasados ​​al constructor del functor ) y pueden usarse para mantener información de estado asociada por functor junto con la función. Dado que tanto los functores como los punteros de función se pueden invocar utilizando la sintaxis de una llamada de función, son intercambiables como argumentos para plantillas cuando el parámetro correspondiente solo aparece en contextos de llamada de función.operator()

Un tipo de functor particularmente común es el predicado . Por ejemplo, algoritmos como find_iftoman un predicado unario que opera sobre los elementos de una secuencia. Algoritmos como sort, part_sort, nth_element y todos los contenedores ordenados utilizan un predicado binario que debe proporcionar un ordenamiento débil estricto , es decir, debe comportarse como una prueba de membresía en una relación binaria transitiva, no reflexiva y asimétrica . Si no se proporciona ninguno, estos algoritmos y contenedores usan less de forma predeterminada, lo que a su vez llama al operador menor que <.

Críticas

Calidad de implementación de compiladores de C++

La Calidad de Implementación (QoI) del compilador de C++ tiene un gran impacto en la usabilidad del STL (y del código con plantilla en general):

Otros asuntos

Implementaciones

Ver también

Notas

  1. ^ Holzner, Steven (2001). C++: Libro Negro . Scottsdale, Arizona: Grupo Coriolis. pag. 648.ISBN​ 1-57610-777-9. El STL se compone de contenedores , iteradores , objetos de función y algoritmos.
  2. ^ Musser, David (2001). Tutorial STL y guía de referencia: programación en C++ con la biblioteca de plantillas estándar . Addison Wesley . ISBN 0-201-37923-6.
  3. ^ Carreras de ligereza en órbita (5 de marzo de 2011). "¿Cuál es la diferencia entre" STL "y" Biblioteca estándar C ++ "?" Desbordamiento de pila . Consultado el 21 de octubre de 2021 .
  4. ^ Josuttis, Nicolai M. (1999). La biblioteca estándar de C++: tutorial y manual . Profesional de Addison-Wesley. pag. 547.ISBN 9780201379266.
  5. ^ Vandevoorde, David; Josuttis, Nicolai M. (2002). Plantillas C++: la guía completa . Addison Wesley . ISBN 0-201-73484-2.
  6. ^ Stepanov, Alejandro; Lee, Meng (31 de octubre de 1995). "La biblioteca de plantillas estándar" (PDF) . Consultado el 16 de diciembre de 2018 . La mayoría de las plantillas algorítmicas de la biblioteca que operan en estructuras de datos tienen interfaces que utilizan rangos. Un rango es un par de iteradores que designan el principio y el final del cálculo. [...] en general, un rango [i, j) se refiere a los elementos en la estructura de datos comenzando con el señalado por i y hasta el señalado por j, pero sin incluirlo. El rango [i, j) es válido si y sólo si j es accesible desde i.
  7. ^ Adrián Piedra. "Minimizar la sobrecarga de código: sobreespecialización de plantillas".
  8. ^ Meyers, Scott (2005). Tercera edición efectiva de C++: 55 formas específicas de mejorar sus diseños. Addison Wesley . ISBN 0-321-33487-6.
  9. ^ Sutter, hierba ; Alexandrescu, Andrei (2004). Estándares de codificación de C++: 101 reglas, pautas y mejores prácticas . Addison-Wesley. ISBN 0-321-11358-6.
  10. ^ Andrei Alexandrescu (6 de mayo de 2009). "Los iteradores deben desaparecer" (PDF) . BoostCon 2009 . Consultado el 19 de marzo de 2011 .
  11. ^ Matthew Wilson (febrero de 2004). "API de enumeración de devolución de llamada y el concepto de iterador de entrada". Diario del Dr. Dobb .
  12. ^ Bjarne Stroustrup (2000). El lenguaje de programación C ++ (3ª ed.). Addison-Wesley. ISBN 0-201-70073-5.: pág.530 
  13. ^ Más algoritmos STL (revisión 2)
  14. ^ "Biblioteca estándar Apache C++". stdcxx.apache.org . Consultado el 1 de marzo de 2023 .

Referencias

enlaces externos