Librerías estándar en C++ STL: Standard Template Library Álvaro Sánchez Miralles José Porras (Fidel Fernández) Cadenas de caracteres • Es una clase que se encuentra en librería estandar <string> • Consta, entre otros, de: – todo tipo de constructores – string substr(unsigned int pos_ini = 0, unsigned int n = npos); • Devuelve una subcadena de la cadena que lo invoca formada por los caracteres que ocupan las posiciones entre pos_ini y pos_ini+n. – unsigned int find(const char *s, unsigned int pos_ini = 0); • Devuelve la posición de la subcadena s dentro de la cadena que lo invoca, buscando a partir de la posición inicial pos_ini. – const char *c_str(); • Usada para conseguir un char* cuando se tiene una cadena de tipo string. – unsigned int length(); • Devuelve la longitud de la cadena de caracteres que lo invoca. Programación de Robots Móviles - Librería estándar - 2 Cadenas de caracteres – char& operator[](unsigned int pos); • Usado para acceder a cada uno de los caracteres de una cadena. El uso es el mismo que el de un vector. – string& operator+=(const string& s); – string& operator+=(const char *sz); • Usadas para concatenar cadenas de caracteres. – string& erase(unsigned int pos_ini = 0, unsigned int n = npos); • Borra los caracteres entre la pos_ini y pos_ini+n de la cadena que lo invoca. – bool empty(); • Indica si una cadena está o no vacía. Programación de Robots Móviles - Librería estándar - 3 Cadenas de caracteres #include <iostream> #include <string> 1: hola hola2 using namespace std; 2: adios int main(int argc, char* argv[]) 2b: hola { 3: [3] a // inicializaciones 4: hol string sCadena; string sCadena2("hola2"); sCadena = "hola"; cout << "1: " << sCadena << " " << sCadena2 << endl; // paso de char* a string y viceversa char szCadena[10]="adios"; sCadena = szCadena; cout << "2: " << sCadena << endl; sCadena = "hola"; strcpy(szCadena,sCadena.c_str()); cout << "2b: " << szCadena << endl; // operaciones de acceso cout << "3: " << "[3] " << sCadena[3] << endl; cout << "4: " << sCadena.substr(0,3) << endl; Programación de Robots Móviles - Librería estándar - 4 Cadenas de caracteres // operaciones de busqueda cout << "5: " << sCadena.find("la",0) << endl; // operaciones de modificacion cout << "6: " << sCadena.erase(0,2) << endl; // operación de concatenación cout << "7: " << sCadena + sCadena2 << endl; // operación de comparación cout << "8: " << (sCadena == sCadena) << endl; // otras operaciones cout << "9: " << sCadena.length() << endl; return 0 5: 2 6: la 7: lahola2 8: 1 9: 2 } Programación de Robots Móviles - Librería estándar - 5 Contenedores • Contenedor: es un objeto capaz de contener otros objetos – vectores (vector): acceso a objetos rápido, pero lento en inserciones y borrados. – listas (list): acceso a objetos lento, pero rápido en inserciones y borrados. • El manejo de una lista y de un vector es muy similar esto hace que tengan muy parecidas funciones miembro. • Regla general: – Si se quiere un contenedor con tamaño poco variable, usar un vector, sino usar una lista. Programación de Robots Móviles - Librería estándar - 6 Plantillas • Las plantillas permiten programar un clase o una función de forma genérica: es decir que valga para diferentes tipos de datos. • Por ejemplo int main(int argc, char* argv[]) { list<string> l_s; // lista de cadenas de caracteres vector<double> v_d; // vector de double vector<int> v_i; // vector de int .... • Cuando se programa: – Como no se sabe el tipo de datos que va a usar se usa un tipo de datos genérico (en este caso es T) • void push_back(const T& x); – Esto es una función que usa como parámetro una variable x de tipo T – Sólo se sabe qué es T cuando se hace una instancia de la clase; es decir, un objeto. Programación de Robots Móviles - Librería estándar - 7 Listas • Es una clase que se encuentra en <list> • Operaciones de inserción – void push_back(const T& x); • Inserta al final de la lista que lo invoca – void push_front(const T& x); • Inserta al inicio de la lista que lo invoca – void insert(iterator it, unsigned int ncopias, const T& x); • Inserta antes del iterador. No es más que una abstracción de un puntero a un nodo de la lista. Ver siguientes diapositivas Programación de Robots Móviles - Librería estándar - 8 Listas • Operaciones de borrado – void pop_back(); • Elimina del final de la lista que lo invoca – void pop_front() • Elimina el primer elemento de la lista que lo invoca – void clear(); • Elimina todos los elementos – iterator erase(iterator it); • Elimina el elemento que indica el iterador. Programación de Robots Móviles - Librería estándar - 9 Listas • Para recorrer una lista, ver Iteradores más adelante – Conseguir un iterador con iterator begin(); • Devuelve un iterador al principio de la lista – T& front(); • Devuelve el primer elemento de la lista – T& back(); • Devuelve el último elemento de la lista • Otras operaciones – unsigned int size(); – bool empty(); Programación de Robots Móviles - Librería estándar - 10 Iteradores • Definición: – Un iterador es un objeto que hace las funciones de cursor puntero con el objetivo de poder acceder a los elementos de una secuencia. – Es una abstración de la noción de un puntero a un elemento de una secuencia de datos (vector, lista, ...) • Por ejemplo: – int* es un iterador de int[ ] – list<int>::iterator es un iterador de la clase list. • Dado un contenedor begin() elem[0] end() elem[1] ... elem[n] Programación de Robots Móviles - Librería estándar - 11 Iteradores de una lista • Iteradores de una lista – – – – iterator begin(); iterator end(); reverse_iterator rbegin(); (es bidireccional) reverse_iterator rend(); (es bidireccional) • Operaciones de los iteradores – Similares a los punteros – void operator++() • Mueve el iterador al siguiente elemento – T& operator*() • Devuelve el contenido apuntado por el iterador Programación de Robots Móviles - Librería estándar - 12 Listas ejemplo #include <iostream> #include <string> #include <list> using namespace std ; int main(int argc, char* argv[]) { list<string> List; list<string>::iterator iList; list<string>::reverse_iterator riList; char szNum[3]; // inserciones en la lista List.push_back("A1"); List.push_back("B2"); List.push_back("C3"); List.push_back("D4"); List.push_back("E5"); List.push_back("F6"); List.push_back("G7"); Programación de Robots Móviles - Librería estándar - 13 Listas ejemplo // recorrer la lista, mostrar por pantalla e insertar nodos iList=List.begin(); cout << "La lista es: "; int iTamano = List.size(); for (int i = 0; i < iTamano ; i++, iList++) { cout << *iList << " "; List.insert(iList,1,itoa(i,szNum,10)); } // recorrer la lista en sentido inverso riList=List.rbegin(); cout << "\nLa lista 2 es: "; for (i = 0; i < List.size() ; i++, riList++) cout << *riList << " "; La lista es: A1 B2 C3 D4 E5 F6 G7 La lista 2 es: G7 6 F6 5 E5 4 D4 3 C3 2 B2 1 A1 0 Programación de Robots Móviles - Librería estándar - 14 Listas ejemplo // borrado de nodos y mostrar lista por pantalla List.pop_back(); List.pop_front(); iList=List.begin(); cout << "\nLa lista 3 es: "; for (i = 0; i < List.size() ; i++, iList++) cout << *iList << " "; // funciones de vaciado de lista cout << "\nVacia? " << List.empty(); List.clear(); cout << "\nVacia de nuevo? " << List.empty(); return 0; } La lista 3 es: A1 1 B2 2 C3 3 D4 4 E5 5 F6 6 Vacia? 0 Vacia de nuevo? 1 Programación de Robots Móviles - Librería estándar - 15 Vectores • Es una clase que se encuentra en <vector> • Operaciones de inserción – void push_back(const T& x); – void insert(iterator it, unsigned int ncopias, const T& x); • Operaciones de borrado – void pop_back(); – void clear(); – iterator erase(iterator it); • Para recorrer un vector, ver Iteradores – conseguir un iterador con iterator begin(); – T& front(); – T& back(); – T& operator[](unsigned int pos); Programación de Robots Móviles - Librería estándar - 16 Vector ejemplo #include <iostream> #include <string> #include <vector> using namespace std ; int main(int argc, char* argv[]) { vector<string> Vector(1); vector<string>::iterator iVector; vector<string>::reverse_iterator riVector; // inserciones en el vector Vector[0] = "A1"; Vector.push_back("B2"); Vector.push_back("C3"); Vector.push_back("D4"); Vector.push_back("E5"); Vector.push_back("F6"); Vector.push_back("G7"); Programación de Robots Móviles - Librería estándar - 17 Vector ejemplo // recorrer el vector, mostrar por pantalla cout << "\nEl vector es: "; iVector=Vector.begin(); cout << Vector[0] << " "; iVector++; for (i = 1; i < Vector.size() ; i++, iVector++) cout << *iVector << " "; // inseción de nodos de otra manera Vector.resize(8); Vector[7] = "8"; iVector=Vector.end(); Vector.insert(iVector,2,"9"); // recorrer la lista en sentido inverso riVector=Vector.rbegin(); cout << "\nEl vector 2 es: "; for (i = 0; i < Vector.size() ; i++, riVector++) cout << *riVector << " "; El vector es: A1 B2 C3 D4 E5 F6 G7 El vector 2 es: 9 9 8 G7 F6 E5 D4 C3 B2 A1 Programación de Robots Móviles - Librería estándar - 18 Vector ejemplo // borrado de nodos y mostrar vector por pantalla Vector.pop_back(); iVector=Vector.begin(); cout << "\nEl vector 3 es: "; for (i = 0; i < Vector.size() ; i++, iVector++) cout << *iVector << " "; // funciones de vaciado de vector cout << "\nVacio? " << Vector.empty(); Vector.clear(); cout << "\nVacio de nuevo? " << Vector.empty(); return 0; } El vector 3 es: A1 B2 C3 D4 E5 F6 G7 8 9 Vacio? 0 Vacio de nuevo? 1 Programación de Robots Móviles - Librería estándar - 19 Ejercicio • Modificar la clase CPoligono y CEntorno, para que en vez de usar un vector [] de C, use un contenedor de la librería estándar de C++ – ¿Se usará una lista o un vector? Programación de Robots Móviles - Librería estándar - 20 Nuestras limitaciones • La programación con plantillas o templates no es objetivo de este curso, es complicada y truculenta. – Diseñar plantillas es todo un arte y permite dar mucha flexibilidad a los programas – Existen alternativas para no usar plantillas, pero que requieren conocimientos muy avanzados de C++ para conseguir lo mismo que con ellas – En este curso sólo hace falta saber utilizarlas para poder usar la librería estándar de C++, que está toda construida con plantillas, de ahí su nombre. (STL: standard template library) • La librería estándar define muchos más conceptos – Más contenedores: map, multimap, set, etc. – Más iteradores – Más conceptos: secuencias, algoritmos, alocadores, gestión de errores, etc. Programación de Robots Móviles - Librería estándar - 21