2. Descripción de STL
• C++ incluye un extenso conjunto de
bibliotecas, en particular, la Biblioteca
de Plantillas Estándar (STL) conocida en
inglés como Standard Template Library.
• STL ofrece componentes de propósito
general para tareas comunes de
programación.
Mtl. Lourdes Cahuich 2
3. Descripción de STL
• Estos componentes se caracterizan
por su flexibilidad, eficiencia, y bases
teóricas. La biblioteca está organizada
en tres abstracciones principales:
1. Contenedores
2. Iteradores
3. Algoritmos
Mtl. Lourdes Cahuich 3
4. Descripción de STL
• Los contenedores incluyen cadenas de
caracteres, vectores, listas, conjuntos,
pilas, etc.
• Los contenedores están organizados
como una colección de clases de C++
independientes.
Mtl. Lourdes Cahuich 4
5. Descripción de STL
• Todas las clases contenedoras de STL
son plantillas (templates), y por lo
tanto pueden acomodar elementos de
tipos arbitrarios.
• Existe una grande y bien organizada
colección de algoritmos de STL que
desempeñan muchas de las tareas que
podríamos esperar ver manejadas por
una función miembro
Mtl. Lourdes Cahuich 5
6. Descripción de STL
• Por ejemplo, existe una función
universal remove() que trabaja en
todos los tipos de contenedores.
• Otro ejemplo de los algoritmos de STL
son los métodos para buscar,
acomodar, reemplazar y otras
operaciones funcionales
Mtl. Lourdes Cahuich 6
7. Descripción de STL
• El acceso a los elementos almacenados
en un contenedor siempre está mediado
por iteradores, un tipo de arreglo
índice o un apuntador generalizado.
• A diferencia de otras bibliotecas
similares, STL se enfoca fuertemente en
abstracciones algorítmicas.
Mtl. Lourdes Cahuich 7
8. Descripción de STL
• Su implantación recae fuertemente en
plantillas (templates), pero usa un
poco de las funciones virtuales y de
herencia.
• Como consecuencia, la eficiencia de los
componentes de STL por lo general
iguala a la de los componentes
desarrollados usando el código
tradicional de C++.
Mtl. Lourdes Cahuich 8
9. Descripción de STL
• Es mejor pensar en STL como una
extensión del lenguaje en lugar de una
biblioteca tradicional.
• Estructuras de datos más complicadas
que no son parte de la biblioteca, como
grafos y tablas hash, pueden ser
construidas fácilmente sobre los
componentes existentes de STL.
Mtl. Lourdes Cahuich 9
10. Descripción de STL
• El uso de los componentes de la
biblioteca permite a los diseñadores de
una clase, enfocarse en el desarrollo
conceptual del diseño y en la
funcionalidad de la clase nueva, en
lugar de pasar mucho tiempo
programando y depurando las
estructuras estándar
Mtl. Lourdes Cahuich 10
12. Contenedores estándar
• Los contenedores estándar están
disponibles a través de los siguientes
archivos de encabezado (también
conocidos como archivos de cabecera),
cuyos nombres indican el tipo de
contenedor correspondiente.
Mtl. Lourdes Cahuich 12
16. Contenedores estándar - iteradores
• Los iteradores ofrecen una interfaz
uniforme entre los contenedores y los
algoritmos en STL.
• Los iteradores son modelados a partir
de apuntadores sencillos de C++.
Mtl. Lourdes Cahuich 16
17. Contenedores estándar - iteradores
• En particular, los operadores
operator*, operator++ entre otros,
son sobrecargados apropiadamente, por
lo que el uso de iteradores es muy
similar al uso de apuntadores.
Mtl. Lourdes Cahuich 17
18. Contenedores estándar - iteradores
• Por ejemplo, en el siguiente listado se
muestra el idioma estándar para
recorrer un contenedor e imprimir sus
elementos.
Mtl. Lourdes Cahuich 18
19. string A = quot;This is a stringquot;;
string::iterator it;
//create iterator
for (it = A.begin(); it != A.end(); ++it)
{
cout << *it << endl;
}
Mtl. Lourdes Cahuich 19
20. Contenedores estándar - iteradores
• Aquí it es un iterador adecuado para el
contenedor A.
• Las funciones miembro A.begin() y
A.end() regresan los iteradores, uno
apuntando al primer elemento en A, y
el otro apuntando a quot;uno-después-del-
finalquot;, significando una posición
hipotética que podría ser ocupada por
el último elemento si se agregara al
contenedor otro elemento
Mtl. Lourdes Cahuich 20
23. Algoritmos de STL
• El núcleo de STL es su extensa
colección de algoritmos.
• Debido a que los iteradores forman
la interfaz entre los contenedores y los
algoritmos en STL, los algoritmos son
(en su mayor parte) implantados como
funciones libres
Mtl. Lourdes Cahuich 23
24. Algoritmos de STL
• Usar funciones libres en lugar de funciones
miembro tiene el efecto deseado de reducir
su número considerablemente.
• En algunos casos especiales, uno puede ser
forzado a usar funciones miembro, ya sea
porque el iterador no puede proveer
suficiente información, o por razones de
eficiencia. (como veremos, la operación
erase y la clase list de STL son ejemplos)
Mtl. Lourdes Cahuich 24
25. Algoritmos de STL
• A través del curso, examinaremos
muchos de los algoritmos de STL.
• Para el contenedor string, vale la
pena examinar las funciones replace
y reverse.
• La función replace sustituye todas las
ocurrencias de un elemento con un
valor particular, por otro valor
Mtl. Lourdes Cahuich 25
27. Un Vector Como una Clase de Arreglo
• La clase vector brinda una alternativa
segura y con muchas características
para un arreglo.
• Similar a un arreglo, un vector
almacena secuencialmente series de
objetos de tipos de datos idénticos.
Mtl. Lourdes Cahuich 27
28. Usando Vector como un arreglo
• Debido a que es un contenedor de STL,
la clase vector soporta programación
genérica.
• Podemos crear un vector que almacena
enteros, cadenas de caracteres, o uno
que almacena cualquier otro tipo
primitivo o definido por el usuario
Mtl. Lourdes Cahuich 28
29. Usando Vector como un arreglo
• Los arreglos pueden ser peligrosos de
usar debido a que no brindan
funcionalidad al programador.
• Al usar arreglos, el programador es
responsable de crear cualquier
funcionalidad de alto nivel, como
cambiar el tamaño o revertir el arreglo.
Mtl. Lourdes Cahuich 29
30. Usando Vector como un arreglo
• Estas implantaciones pueden ser
riesgosas y si no son codificadas
correctamente, pueden introducir leves
errores en una aplicación.
• Los vectores son una alternativa más
segura para los arreglos, debido a que
proveen funciones miembro que
implantan estas (y otras) tareas de alto
nivel
Mtl. Lourdes Cahuich 30
32. Usando Vector como un arreglo
• Observa que para poder usar objetos
de tipo vector, tenemos que incluir la
biblioteca que define la clase vector.
• Es interesante notar que también
podemos declarar un vector de objetos
vector.
Mtl. Lourdes Cahuich 32
33. Usando Vector como un arreglo
• Esto provee una implantación para una
estructura de datos bidimensional como
una matriz
vector<vector<int> > matrix;
Mtl. Lourdes Cahuich 33
34. Usando Vector como un arreglo
• Para evitar confusión con el operador
>> , la mayoría de los compiladores
dejan un espacio siguiendo el primer
signo de mayor que (>).
• Esto aplica para cualquier declaración
anidada de plantillas (templates), no
sólo para vectores de vectores.
Mtl. Lourdes Cahuich 34
35. Usando Vector como un arreglo
• La clase vector contiene un conjunto de
constructores que los programadores
pueden usar para establecer el tamaño
inicial del vector y los valores iniciales
de los elementos.
Mtl. Lourdes Cahuich 35
36. #include <string>
#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char* argv[]) {
vector<int> v1; // initially empty
vector<int> v2(5);
// 5 elements, initialized to 0
vector<int> v3(10, 1);
// 10 elements, initialized to 1
vector<int> v4(v3);
// v4 is a copy of v3
return EXIT_SUCCESS;
}
Mtl. Lourdes Cahuich 36
37. Usando Vector como un arreglo
• Podemos acceder a los elementos
almacenados en un vector de diferentes
maneras.
• Primero, la clase vector sobrecarga el
operator[].
• Esto nos permite acceder elementos
usando una sintaxis similar a la de
subíndices de un arreglo
Mtl. Lourdes Cahuich 37
38. Usando Vector como un arreglo
• Al igual que el acceso por subíndices, el
operator[] sobrecargado de la clase
vector no brinda una revisión del acceso
fuera de los límites.
• Cuando se requiere la revisión de los
límites, debemos usar el método at().
Mtl. Lourdes Cahuich 38
39. Usando Vector como un arreglo
• También existen métodos de acceso
especial para el primer y último
elemento de un arreglo
vector<int> v(10);
v[1] = 2;
v.at(2) = 45;
v.front() = v.back();
Mtl. Lourdes Cahuich 39
40. Usando Vector como un arreglo
• Además de proveer las funciones
miembro estándar discutidas
anteriormente, la clase vector también
brinda algunas otras funciones que
seguramente no esperaríamos que sean
parte de una clase de arreglo
Mtl. Lourdes Cahuich 40
41. Usando Vector como un arreglo
• Por ejemplo, el método push_back
agrega un dato al final del vector.
• Este método automáticamente aumenta
el tamaño del vector para acomodar el
nuevo elemento.
• El método pop_back desempeña la
tarea opuesta.
Mtl. Lourdes Cahuich 41
42. Usando Vector como un arreglo
• Esta función miembro elimina el último
elemento del vector, reduciendo su
tamaño en uno.
• La función empty despliega true si el
vector contiene cero elementos, y
false en caso contrario
Mtl. Lourdes Cahuich 42
43. // An initially empty
vectorvector<int> v;
// push elements in
for (int i = 0; i < 5; i++) {
v.push_back(i);
cout << quot;Size: quot; << v.size() << endl;
}
// pop elements off
for (int j = 0; j < 5; j++) {
v.pop_back();
cout << quot;Size: quot; << v.size() << endl;
}
cout << endl << v.empty() << endl;
Mtl. Lourdes Cahuich 43