Herramientas de usuario

Herramientas del sitio


cpp-avanzado:deque

Tabla de Contenidos

Deque

  • Conocimientos mínimos: Vector

Motivación

vector, que se utiliza en C++ para representar arreglos de tamaño dinámico, es una de las estructuras más comunes y utilizadas para guardar listas de valores 1).

Además de la indexación (con corchetes, como en v[5]) vector tiene muchas operaciones de utilidad, como por ejemplo .front(), .back(), .push_back() y .pop_back(). Sin embargo, a vector le faltan un par de operaciones interesantes, que son .push_front() y .pop_front(). Como su nombre sugiere, estas operaciones se comportan de manera análoga a las clásicas push_back y pop_back, pero insertan o eliminan un elemento por el comienzo del deque (es decir, la posición $0$) en lugar de por el final (posición $N-1$).

Deque es una estructura más poderosa que vector: permite todas las operaciones que vector permite (incluso la indexación con corchetes), y además permite usar .push_front() y .pop_front(), que son eficientes (su complejidad temporal es $O(1)$ amortizado).

Ejemplo

Supongamos que leemos un $N$, y una lista de $N$ elementos de la entrada, y tenemos que escribirla en la salida pero “mezclada”, de manera tal que el primer elemento queda “en el medio” de la lista, y los siguientes se van poniendo, alternadamente, uno a la izquierda y uno a la derecha. Por ejemplo si se ingresa:

7
1 2 3 4 5 6 7

Queremos generar en la salida:

6 4 2 1 3 5 7

Es fácil dar un programa que haga esto aprovechando las capacidades de deque, que nos permiten justamente realizar estas dos operaciones: agregar a izquierda, y agregar a derecha.

#include <iostream>
#include <deque>
 
using namespace std;
 
int main()
{
    int N; cin >> N;
    deque<int> resultado;
    for (int i=0;i<N;i++)
    {
        int x; cin >> x;
        if (i%2 == 0)
            resultado.push_back(x);
        else
            resultado.push_front(x);        
    }
    for (int i=0;i<N;i++)
    {
        if (i>0) cout << " ";
        cout << resultado[i];
    }
    cout << endl;
    return 0;
}
1)
O incluso matrices, mediante listas de listas.
cpp-avanzado/deque.txt · Última modificación: 2017/11/23 22:13 por santo