Librerías estándar en C++ STL: Standard Template Library

Anuncio
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
Descargar