Este artículo define los conceptos básicos de la biblioteca estándar de C ++. Se da para referirse a él en el futuro.
La parte más grande de la Biblioteca estándar de C ++ es la STL (Biblioteca de plantillas estándar). La biblioteca STL contiene cinco tipos principales de componentes:
- contenedor : controla un conjunto de objetos en la memoria.
- iterador : proporciona un algoritmo para que el algoritmo acceda al contenido del contenedor.
- algoritmo : define un procedimiento computacional.
- objeto de función : encapsula una función en un objeto para su uso por otros componentes.
- adaptador : adapta un componente para proporcionar una interfaz diferente.

Todos los componentes cumplen una serie de requisitos, por lo tanto, están en buen acuerdo entre sí.
De la definición del contenedor, se deduce que cualquier estructura de datos de usuario es un contenedor. En nuestro caso, los
contenedores tienen estructuras de datos estándar , como una lista, un vector, un diccionario y muchos otros. Los requisitos formales para los contenedores son bastante amplios, pero la regla básica es el acceso a los elementos. El acceso a los elementos del contenedor se realiza a través de objetos especiales:
iteradores (ver más abajo). Es posible que no sepa cómo se encuentran los elementos del contenedor en la memoria, pero sabe con certeza que los iteradores se pueden iterar secuencialmente, y cada uno de ellos proporcionará acceso al elemento. Se puede obtener un iterador apuntando al primer elemento utilizando el método
iterador begin (); contenedor Se puede obtener un iterador que apunta
al último elemento utilizando el método
iterator end (); contenedor En otras palabras, los iteradores se ubican en un
medio intervalo (o
medio segmento), que puede escribirse formalmente como [inicio, fin]. Ejemplo de declaración de contenedor:
struct a_container { struct an_iterator; an_iterator begin(); an_iterator end(); };
El estándar C ++ 20 esperado sugiere el uso de una estructura que encapsula medios rangos - rangos
Un iterador es un objeto que proporciona acceso a los elementos del contenedor y permite ordenarlos. Un iterador es una propiedad del contenedor. En las primeras implementaciones de la biblioteca estándar de C ++, se implementó un iterador como puntero a un elemento contenedor. En implementaciones modernas, esta es una clase que encapsula un puntero a un objeto contenedor.
Los requisitos principales para los iteradores son la presencia de operadores de desreferenciación e incremento. A continuación se muestra una declaración de contenedor con un iterador.
template<typename TYPE> struct a_container { struct an_iterator { void operator++(); TYPE& operator*(); }; an_iterator begin(); an_iterator end(); };
No puedo dar una mejor definición del algoritmo que el estándar: un
algoritmo es una secuencia de acciones que conduce a un resultado deseado en un número finito de pasos .
En el caso de STL, los algoritmos se implementan mediante funciones de plantilla que toman medios intervalos de iteradores como parámetros de entrada. La firma general de estos algoritmos se describe a continuación:
template<typename ITERATOR, typename RESULT> RESULT an_algorithm(ITERATOR first, ITERATOR last, ...);
En una declaración de clase, puede anular el operador (). Si este operador se reemplaza en una clase, los objetos de esta clase reciben propiedades de funciones (se pueden usar como funciones). Dichos objetos se denominan funcionales o
functores . Es conveniente usar functors cuando una función debe tener "memoria", así como reemplazar punteros a funciones.
Comenzando con el estándar C ++ 11, existe la posibilidad de una breve notación de los functores: funciones lambda.
No hay requisitos especiales para functors. A menos que a veces se requiera la herencia de la
función functor (hasta el estándar C ++ 11: función_unaria o función_binaria). Un pequeño ejemplo de implementación de un functor:
template<typename TYPE> struct plus{ TYPE operator ()(const TYPE& p1, const TYPE& p2) const{ return p1 + p2; } };
STL también ofrece una serie de clases y funciones (funciones) que transforman la interfaz a la correcta. En particular, hay un adaptador de pila que implementa una pila basada en contenedores. Como ejemplo, podemos considerar el adaptador de una función binaria a una función unaria (en este momento esta función está en desuso en el estándar C ++):
template<typename BIDIRECTIONAL_FUNCTION, typename TYPE> class bind1st { BIDIRECTIONAL_FUNCTION _bf; TYPE _first; public: bind1st(BIDIRECTIONAL_FUNCTION bf, TYPE first): _bf(bf), _first(first) {} TYPE operator()(const TYPE& p) const { return _bf(_first, p); } };
Para lectura independiente
- C ++ 20 draft en github
- Referencia de C ++
- Desarrollo de aplicaciones C ++
- Range-v3, propuesta de estándar