7 Stl Y Los Contenedores Basicos

43
2.2 STL y los Contenedores Básicos Apoyo SSD5

Transcript of 7 Stl Y Los Contenedores Basicos

Page 1: 7 Stl Y Los Contenedores Basicos

2.2 STL y los Contenedores Básicos

Apoyo SSD5

Page 2: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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.

Page 3: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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

Page 4: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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.

Page 5: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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

Page 6: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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

Page 7: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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.

Page 8: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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++.

Page 9: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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.

Page 10: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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

Page 11: 7 Stl Y Los Contenedores Basicos

Contenedores

Page 12: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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.

Page 13: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 13

#include <string> // strings

#include <vector> // arrays

#include <list>

// cyclic doubly linked lists

#include <deque>

// hybrid list/array

#include <queue> // queue

#include <stack> // stack

#include <bitset> // bit-vectors

#include <set> // general sets

#include <map>

// associative arrays

Page 14: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 14

Contenedores estándar

• En el siguiente listado se observa el soporte de cálculos numéricos.

#include <complex> //complex numbers

#include <valarray> //numerical arrays

#include <numeric> //numerical algorithms

#include <cmath> //math functions

Page 15: 7 Stl Y Los Contenedores Basicos

Iteradores

Page 16: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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++.

Page 17: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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.

Page 18: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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.

Page 19: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 19

string A = "This is a string";

string::iterator it; //create iteratorfor (it = A.begin(); it != A.end(); ++it)

{

cout << *it << endl;

}

Page 20: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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 "uno-después-del-final", significando una posición hipotética que podría ser ocupada por el último elemento si se agregara al contenedor otro elemento

Page 21: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 21

for (it = A.begin(); it != A.begin() + 10; ++it)

{

cout << *it << endl;

}

Page 22: 7 Stl Y Los Contenedores Basicos

Algoritmos

Page 23: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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

Page 24: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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)

Page 25: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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 replacey reverse.

• La función replace sustituye todas las ocurrencias de un elemento con un valor particular, por otro valor

Page 26: 7 Stl Y Los Contenedores Basicos

Cómo Usar el Contenedor vector de STL

Page 27: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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 vectoralmacena secuencialmente series de objetos de tipos de datos idénticos.

Page 28: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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

Page 29: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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.

Page 30: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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

Page 31: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 31

#include <string>

#include <cstdlib>

#include <iostream>

#include <vector>

using namespace std;

int main(int argc, char* argv[]) {

vector<int> v1;

vector<double> v2;

vector<bool> v3;

vector<string> v4;

return EXIT_SUCCESS;

}

Page 32: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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.

Page 33: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 33

Usando Vector como un arreglo

• Esto provee una implantación para una estructura de datos bidimensional como una matriz

vector<vector<int> > matrix;

Page 34: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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.

Page 35: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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.

Page 36: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 36

#include <string>#include <cstdlib>#include <iostream>#include <vector>using namespace std;int main(int argc, char* argv[]) {

vector<int> v1; // initially emptyvector<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 v3return EXIT_SUCCESS;

}

Page 37: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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

Page 38: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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().

Page 39: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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();

Page 40: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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

Page 41: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 41

Usando Vector como un arreglo

• Por ejemplo, el método push_backagrega 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.

Page 42: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 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

Page 43: 7 Stl Y Los Contenedores Basicos

Mtl. Lourdes Cahuich 43

// An initially empty

vectorvector<int> v;// push elements in

for (int i = 0; i < 5; i++) {

v.push_back(i);cout << "Size: " << v.size() << endl;

}// pop elements off

for (int j = 0; j < 5; j++) {v.pop_back();

cout << "Size: " << v.size() << endl;}

cout << endl << v.empty() << endl;