librerías estándar en c++ stl: standard template … · programación de robots móviles -...

21
Librerías estándar en C++ STL: Standard Template Library Álvaro Sánchez Miralles José Porras (Fidel Fernández)

Upload: vuongnhu

Post on 05-Oct-2018

228 views

Category:

Documents


0 download

TRANSCRIPT

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.