Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


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

  Inicio.


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