7 Stl Y Los Contenedores Basicos

5,187 views

Published on

1 Comment
0 Likes
Statistics
Notes
  • interesante presentación, me dejo mas claro el trabajo con vector
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Be the first to like this

No Downloads
Views
Total views
5,187
On SlideShare
0
From Embeds
0
Number of Embeds
684
Actions
Shares
0
Downloads
68
Comments
1
Likes
0
Embeds 0
No embeds

No notes for slide

7 Stl Y Los Contenedores Basicos

  1. 1. 2.2 STL y los Contenedores Básicos Apoyo SSD5
  2. 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. 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. 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. 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. 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. 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. 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. 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. 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
  11. 11. Contenedores
  12. 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
  13. 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 Mtl. Lourdes Cahuich 13
  14. 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 Mtl. Lourdes Cahuich 14
  15. 15. Iteradores
  16. 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. 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. 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. 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. 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
  21. 21. for (it = A.begin(); it != A.begin() + 10; ++it) { cout << *it << endl; } Mtl. Lourdes Cahuich 21
  22. 22. Algoritmos
  23. 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. 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. 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
  26. 26. Cómo Usar el Contenedor vector de STL
  27. 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. 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. 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. 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
  31. 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; } Mtl. Lourdes Cahuich 31
  32. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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

×