Post on 05-Oct-2018
Librerías estándar en C++
STL: Standard Template Library
Álvaro Sánchez MirallesJosé Porras
(Fidel Fernández)
Programación de Robots Móviles - Librería estándar - 2
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 intpos_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 - 3
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 - 4
Cadenas de caracteres
#include <iostream>#include <string>using namespace std;int main(int argc, char* argv[]){
// inicializacionesstring sCadena;string sCadena2("hola2");sCadena = "hola";cout << "1: " << sCadena << " " << sCadena2 << endl;
// paso de char* a string y viceversachar szCadena[10]="adios";sCadena = szCadena;cout << "2: " << sCadena << endl;sCadena = "hola";strcpy(szCadena,sCadena.c_str());cout << "2b: " << szCadena << endl;
// operaciones de accesocout << "3: " << "[3] " << sCadena[3] << endl;cout << "4: " << sCadena.substr(0,3) << endl;
1: hola hola22: adios2b: hola3: [3] a4: hol
Programación de Robots Móviles - Librería estándar - 5
Cadenas de caracteres
// operaciones de busquedacout << "5: " << sCadena.find("la",0) << endl;
// operaciones de modificacioncout << "6: " << sCadena.erase(0,2) << endl;
// operación de concatenacióncout << "7: " << sCadena + sCadena2 << endl;// operación de comparacióncout << "8: " << (sCadena == sCadena) << endl;// otras operacionescout << "9: " << sCadena.length() << endl;return 0
}
5: 26: la7: lahola28: 19: 2
Programación de Robots Móviles - Librería estándar - 6
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 - 7
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
• 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.
int main(int argc, char* argv[]){
list<string> l_s; // lista de cadenas de caracteresvector<double> v_d; // vector de doublevector<int> v_i; // vector de int
....
Programación de Robots Móviles - Librería estándar - 8
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 - 9
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 - 10
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 - 11
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
elem[0] elem[1] elem[n]...
begin() end()
Programación de Robots Móviles - Librería estándar - 12
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 - 13
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 listaList.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 - 14
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 inversoriList=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 G7La 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 - 15
Listas ejemplo
// borrado de nodos y mostrar lista por pantallaList.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 listacout << "\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 6Vacia? 0Vacia de nuevo? 1
Programación de Robots Móviles - Librería estándar - 16
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 - 17
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 vectorVector[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 - 18
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 maneraVector.resize(8);Vector[7] = "8";iVector=Vector.end();Vector.insert(iVector,2,"9");// recorrer la lista en sentido inversoriVector=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 G7El vector 2 es: 9 9 8 G7 F6 E5 D4 C3 B2 A1
Programación de Robots Móviles - Librería estándar - 19
Vector ejemplo
// borrado de nodos y mostrar vector por pantallaVector.pop_back();iVector=Vector.begin();cout << "\nEl vector 3 es: ";for (i = 0; i < Vector.size() ; i++, iVector++)
cout << *iVector << " ";
// funciones de vaciado de vectorcout << "\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 9Vacio? 0Vacio de nuevo? 1
Programación de Robots Móviles - Librería estándar - 20
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 - 21
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 templatelibrary)
• 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.