4.12.2b Clases genéricas en la Librería Estándar
§1 Sinopsis
Hemos señalado ( 4.12) que
las plantillas fueron introducidas en C++ para dar soporte a determinadas técnicas utilizadas en la Librería Estándar; de
hecho, la STL (
5.1) está
constituida casi exclusivamente por plantillas. A continuación se relacionan algunas de las más importantes
[1].
§9.1 basic_string una plantilla para utilizar entidades como secuencias de caracteres. Está
definida en el fichero de cabecera <string>, y responde a la siguiente declaración:
template <class charT, class traits = char_traits<charT>,
class Allocator = allocator<charT> > class basic_string;
Como puede verse, acepta tres argumentos, de los que dos tienen valores por defecto. Existen dos especializaciones que
tienen nombres específicos. En concreto si charT es char la especialización se denomina string, y
wstring si charT es wchar_t (
2.2.1a1). Esto se hace mediante sendos typedef:
typedef basic_string <char> string;
typedef basic_string <wchar_t> wstring;
de forma que las dos sentencias siguientes son equivalentes:
basic_string<char> s1;
string s1;
§9.2 vector. Un vector es la versión STL de una matriz dinámica de una
dimensión. Las instancias de esta clase genérica conforman una secuencia (un tipo de contenedor
5.1.1). La clase dispone de acceso
aleatorio a sus elementos y de un mecanismo muy eficiente de inserción y borrado de elementos al final. Aunque también pueden
insertarse y borrarse elementos en medio. Está definida en el fichero <vector> y responde a la siguiente
declaración:
template <class T, class Allocator = allocator<T> > class vector;
Una especialización concreta de esta plantilla, cuando el tipo T es un booleano
( 3.2.1b) vector<bool>,
es considerada por la STL como un caso especial, con un código optimizado que incluye métodos no disponibles para el resto de
las instancias (los métodos flip y swap).
§9.3 list. Las instancias de esta plantilla conforman también una secuencia
que dispone de mecanismos muy eficientes para insertar
y eliminar elementos en cualquier punto. Está definida en el fichero <list> y responde a la siguiente declaración:
template <class T, class Allocator = allocator<T> > class list;
§9.4 map. Esta plantilla está definida en el fichero <map>, y tiene la siguiente
declaración:
template <class Key, class T, class Compare = less<Key>
class Allocator = allocator<pair<const Key, T>> > class map;
Las instancias de esta plantilla conforman un contenedor asociativo (una clase de contenedor
5.1.1) que permite almacenar y
acceder objetos de tipo T indexados mediante una única clave Key, disponiendo de mecanismos muy eficientes de inserción
y borrado.
§9.5 auto_ptr. Esta plantilla genera punteros "inteligentes" que destruyen
automáticamente el objeto señalado cuando ellos mismos salen de ámbito. Su definición está en el fichero <memory>,
y su declaración es:
template <class X> class auto_ptr;
En realidad esta plantilla se ha incluido en la Librería Estándar para ayudar a resolver el problema de los objetos
persistentes, creados con el operador new, cuyo referente (el puntero que los señala) es un objeto automático que puede
ser destruido inadvertidamente al salir de ámbito. Lo que puede ocurrir en el los procesos de lanzamiento y captura de
excepciones ( 1.6).
[1] Para más detalles consulte la documentación de la Librería Estándar de Plantillas (STL)
de su compilador y la sección correspondiente de este curso (
5.1).