Bienvenidos sean a este post, hoy veremos otro contenedor de stl.
En este post, mencionamos que este es un contenedor de tipo secuencial. Este es similar a vector, del cual hablamos en el post anterior, pero con sutiles diferencias. Este nos permite la ubicacion de elementos en memoria no continuo. Si bien, es mas lenta su transversabilidad. Una vez que encuentra la posicion, la insercion y eliminacion son mucho mas rapidos. Tambien posee muchas de las funciones de vector pero no todas. Analicemos el siguiente ejemplo para ver como trabaja:
#include <iostream>
#include <string.h>
#include <list>
class Coche
{
public:
Coche(): suMarca("Generica"), suModelo("Generico") {}
Coche(std::string marca, std::string modelo):
suMarca(marca), suModelo(modelo)
{}
std::string GetMarca() const { return suMarca; }
std::string GetModelo() const { return suModelo; }
private:
std::string suMarca;
std::string suModelo;
};
std::ostream & operator<< (std::ostream & salida, const Coche & rhs)
{
salida << "Su marca es " << rhs.GetMarca();
salida << " y el modelo es " << rhs.GetModelo();
return salida;
}
typedef std::list< Coche > Cochera;
template < class T >
void mostrar_lista(const std::list< T > & l)
{
std::cout << "max_size(): " << l.max_size();
std::cout << "\tsize(): " << l.size();
std::cout << "\t" << (l.empty() ? "vacio\n" : "no vacio\n");
for(Cochera::const_iterator ci=l.begin(); ci != l.end(); ++ci)
std::cout << *ci << std::endl;
}
int main()
{
Coche coche1;
Coche coche2("VW","GOL");
Coche coche3("FORD","ECOSPORT");
Coche coche4("AUDI","Q3");
Cochera cocheraVacia;
mostrar_lista(cocheraVacia);
std::cout << " +++ Nueva cochera +++\n";
Cochera cocheraNueva;
cocheraNueva.push_back(coche1);
cocheraNueva.push_back(coche2);
cocheraNueva.push_back(coche3);
mostrar_lista(cocheraNueva);
return 0;
}
Este ejemplo lo tomamos del post anterior donde lo usabamos para mostrar como trabajar con vector. Aqui lo adaptaremos para trabajar con list, por lo que algunas cosas las comentare por arriba. Primero importaremos las tres librerias para trabajar. Siendo la primera para uso general, la segunda para manejar tipos string y la ultima para nuestras listas. Lo siguiente es la clase que usaremos para crear los objetos. Esta tiene dos propiedades privadas para la marca y el modelo de cada coche. En la parte publica tenemos dos constructores para iniciar los valores de las propiedades y dos metodos para obtener los valores de las propiedades. Lo siguiente es una sobrecarga del operador << para poder mostrar los valores de los objetos de la clase Coche mediante los metodos de la clase. Luego crearemos un alias para el tipo list con la clase Coche.
Aqui implementaremos una plantilla para permitir el manejo de distintas clases en list. Esta plantilla la usaremos en una funcion para mostrar listas. Esta mostrara algunos datos de la lista. Como pueden ser el tamaño maximo, max_size, el tamaño actual, size, y si esta vacia o no mediante empty y el operador condicional. Por ultimo, tenemos un bucle que nos mostrara el contenido de la lista. Para crear el objeto que se encargara de cumplir la condicion es mediante un iterador que nos permite desrefernciarlo y saber cual es el nodo donde se ubica. Este tomara como valor inicial a la primera posicion de la lista informada mediante la funcion begin. El bucle se repetira mientras este objeto iterado sea distinto a la posicion final de la lista. Y el incremento se encarga de ir pasando de una posicion a la otra. En el bloque mostraremos el puntero creado para cumplir la condicion y por ende, mostraremos cada valor almacenado. Recuerden que hicimos una sobrecarga del operador para esta clase.
En el main primero crearemos cuatro objetos del tipo Coche con distinta informacion. Lo siguiente es crear un objeto del tipo Cochera y llamaremos a mostrar_lista para ver como es su contenido. Luego crearemos otro objeto del tipo Cochera y en este agregaremos tres de los objetos anteriormente creados mediante push_back. Para finalmente mostrar la lista con la funcion mostrar_lista. Compilemos y veamos como es la salida:
$ ./stl
max_size(): 115292150460684697 size(): 0 vacio
+++ Nueva cochera +++
max_size(): 115292150460684697 size(): 3 no vacio
Su marca es Generica y el modelo es Generico
Su marca es VW y el modelo es GOL
Su marca es FORD y el modelo es ECOSPORT
$
Observen como nos devolvio los datos de las listas creadas. En el primer caso al ser vacia no solamente lo indica sino que nos muestra que no tiene ningun tamaño. En el segundo caso no solamente muestra el tamaño, que no esta vacio, sino tambien el contenido de cada objeto. Hablemos sobre algunas de las funciones que disponemos para manejarlas:
- max_size(), encargada de mostrar el tamaño maximo disponible para la lista
- size(), encargada de mostrar el tamaño actual de la lista
- capacity(), encargada de mostrar la capacidad de la lista
- empty(), esta se encarga de definir si la listta tiene contenido o no por medio de chequeo simple ya que devuelve un booleano
- front(), devuelve el primer valor de la lista
- back(), devuelve el ultimo valor de la lista
- push_front(objeto), agrega un elemento al inicio de la lista
- push_back(objeto), agrega un elemento al final de la lista
- pop_front(), elimina el primer elemento de una lista y disminuye la capacidad en 1
- pop_back(), elimina el ulttimo elemento de una lista y disminuye la capacidad en 1
- begin(), devuelve un iterador que apunta a la primera posicion de la lista
- end(), devuelve un iterador que apunta a la ultima posicion de la lista
En resumen, hoy hemos visto a list, que es, para que sirve, como se compone, asi como las funciones para manipularla, y un ejemplo practico para verlo en accion. Espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donatión
It’s for site maintenance, thanks!
$1.50
