Anuncios

Bienvenidos sean a este post, hoy veremos otro contenedor de stl.

Anuncios
Anuncios

En este post mencionamos que deque es un contenedor de tipo secuencial. Este es una version mejorada de vector porque para manipular la informacion utiliza las mismas mecanicas de list. Es decir, las asignaciones de memoria son unicamente para los nuevos elementos, evitando que se reasigne todo el contenedor a una nueva direccion de memoria. Por esta razon, este tipo de contenedor esta pensado principalmente para cuando necesitamos inserciones y eliminaciones en uno o ambos extremos. Vamos a analizar el siguiente ejemplo:

#include <iostream>
#include <string.h>
#include <deque>

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::deque< Coche > Cochera;

template < class T >
void mostrar_deque(const std::deque< T > & d)
{
        std::cout << "max_size(): " << d.max_size();
        std::cout << "\tsize(): " << d.size();
        std::cout << "\t" << (d.empty() ? "vacio\n" : "no vacio\n");
        for(Cochera::const_iterator ci=d.begin(); ci != d.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_deque(cocheraVacia);
        std::cout << " +++ Nueva cochera +++\n";
        Cochera cocheraNueva;
        cocheraNueva.push_back(coche1);
        cocheraNueva.push_back(coche2);
        cocheraNueva.push_back(coche3);
        mostrar_deque(cocheraNueva);

        return 0;
}
Anuncios
Anuncios

Este ejemplo lo tomamos del post anterior donde lo usabamos para mostrar como trabajar con list. Aqui lo adaptaremos para trabajar con deque, 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 el tipo string y la ultima para nuestras deque. 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 deque con la clase Coche.

Anuncios
Anuncios

Aqui implementaremos una plantilla para permitir el manejo de distintas clases en deque. Esta plantilla la usaremos en una funcion para mostrar el contenido e informacion del deque informado. Esta mostrara algunos datos del deque. 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 desreferenciarlo 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 del deque. 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.

Anuncios

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_deque 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_deque. Compilemos y veamos como es la salida:

$ ./stl
max_size(): 144115188075855871  size(): 0       vacio
 +++ Nueva cochera +++
max_size(): 144115188075855871  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
$
Anuncios

Observen como nos devolvio los datos de los deque creados. En el primer caso al ser vacio 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 el deque
  • size(), encargada de mostrar el tamaño actual del deque
  • capacity(), encargada de mostrar la capacidad del deque
  • empty(), esta se encarga de definir si el deque tiene contenido o no por medio de chequeo simple ya que devuelve un booleano
  • front(), devuelve el primer valor del deque
  • back(), devuelve el ultimo valor del deque
  • push_front(objeto), agrega un elemento al inicio del deque
  • push_back(objeto), agrega un elemento al final del deque
  • pop_front(), elimina el primer elemento de un deque y disminuye la capacidad en 1
  • pop_back(), elimina el ulttimo elemento de un deque y disminuye la capacidad en 1
  • begin(), devuelve un iterador que apunta a la primera posicion del deque
  • end(), devuelve un iterador que apunta a la ultima posicion del deque
Anuncios

En resumen, hoy hemos visto a deque, 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.

Anuncios
pp258

Donatión

It’s for site maintenance, thanks!

$1.50