7 stl y los contenedores basicos
TRANSCRIPT
![Page 1: 7 Stl Y Los Contenedores Basicos](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/1.jpg)
2.2 STL y los Contenedores Básicos
Apoyo SSD5
![Page 2: 7 Stl Y Los Contenedores Basicos](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/2.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/3.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/4.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/5.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/6.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/7.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/8.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/9.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/10.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/11.jpg)
Contenedores
![Page 12: 7 Stl Y Los Contenedores Basicos](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/12.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/13.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/14.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/15.jpg)
Iteradores
![Page 16: 7 Stl Y Los Contenedores Basicos](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/16.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/17.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/18.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/19.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/20.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/21.jpg)
Mtl. Lourdes Cahuich 21
for (it = A.begin(); it != A.begin() + 10; ++it)
{
cout << *it << endl;
}
![Page 22: 7 Stl Y Los Contenedores Basicos](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/22.jpg)
Algoritmos
![Page 23: 7 Stl Y Los Contenedores Basicos](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/23.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/24.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/25.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/26.jpg)
Cómo Usar el Contenedor vector de STL
![Page 27: 7 Stl Y Los Contenedores Basicos](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/27.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/28.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/29.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/30.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/31.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/32.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/33.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/34.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/35.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/36.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/37.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/38.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/39.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/40.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/41.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/42.jpg)
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](https://reader034.vdocuments.site/reader034/viewer/2022042518/55a9c40d1a28aba67d8b474a/html5/thumbnails/43.jpg)
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;