# La clase Deque

(PECL ds >= 1.0.0)

## Introducción

Un Deque (pronunciado “deck”) es una secuencia de valores en un búfer contiguo que crece y se contrae automáticamente. El nombre es una abreviación inglesa común de “double-ended queue” (cola de doble final) y es usado internamente por Ds\Queue.

Dos punteros son usados para mantener el seguimiento de una cabecera y una cola. Los punteros pueden “envolver alrededor” el final del búfer, lo cual evita la necesidad de mover otros valores alrededor para hacer un espacio. Esto permite que hacer cambios y deshacer cambios sean muy rápidos —  algo en que Ds\Vector no puede competir.

Accediendo a un valor por el índice requiere una traducción entre el índice y su posición correspondiente en el búfer: `((cabecera + posición) % capacidad)`.

## Fortalezas

- Soporta la sintaxis array (corchetes).
- Utiliza menos memoria total que un array para el mismo número de valores.
- Automáticamente libera la memoria asignada cuando su tamaño cae lo suficientemente bajo.
- get(), set(), push(), pop(), shift(), y unshift() son todos O(1).

## Debilidades

- La capacidad debe ser una potencia de 2.
- insert() y remove() son O(n).

## Sinopsis de la Clase

class Ds\Deque implements Ds\Sequence, ArrayAccess {
/* Constantes */
const int MIN_CAPACITY = 8;
/* Métodos */
public function allocate(int `$capacity`): void
public function apply(callable `$callback`): void
public function capacity(): int
public function clear(): void
public function contains(mixed `...$values`): bool
public function copy(): Ds\Deque
public function filter(callable `$callback` = ?): Ds\Deque
public function find(mixed `$value`): mixed
public function first(): mixed
public function get(int `$index`): mixed
public function insert(int `$index`, mixed `...$values`): void
public function isEmpty(): bool
public function join(string `$glue` = ?): string
public function last(): mixed
public function map(callable `$callback`): Ds\Deque
public function merge(mixed `$values`): Ds\Deque
public function pop(): mixed
public function push(mixed `...$values`): void
public function reduce(callable `$callback`, mixed `$initial` = ?): mixed
public function remove(int `$index`): mixed
public function reverse(): void
public function reversed(): Ds\Deque
public function rotate(int `$rotations`): void
public function set(int `$index`, mixed `$value`): void
public function shift(): mixed
public function slice(int `$index`, int `$length` = ?): Ds\Deque
public function sort(callable `$comparator` = ?): void
public function sorted(callable `$comparator` = ?): Ds\Deque
public function sum(): int|float
public function toArray(): array
public function unshift(mixed `$values` = ?): void
}

## Constantes predefinidas

`Ds\Deque::MIN_CAPACITY`

## Historial de cambios

Versión | Descripción
--- | ---
PECL ds 1.3.0 | La clase ahora implementa ArrayAccess.

## Tabla de contenidos

- Ds\Deque::allocate — Asigna suficiente memoria para una capacidad requerida
- Ds\Deque::apply — Actualiza todos los valores aplicando una retrollamada a cada valor
- Ds\Deque::capacity — Devuelve la capacidad actual
- Ds\Deque::clear — Elimina todos los valores del deque
- Ds\Deque::__construct — Crea una nueva instancia
- Ds\Deque::contains — Determina si el deque contiene valores dados
- Ds\Deque::copy — Devuelve una copia superficial de la deque
- Ds\Deque::count — Devuelve el número de valores en la colección
- Ds\Deque::filter — Crear un nuevo deque utilizando un callable para determinar qué valores incluir
- Ds\Deque::find — Intenta encontrar el índice de un valor.
- Ds\Deque::first — Devuelve el primer valor de la deque
- Ds\Deque::get — Devuelve el valor en un índice dado
- Ds\Deque::insert — Inserta valores en un índice dado
- Ds\Deque::isEmpty — Indica si la deque está vacía
- Ds\Deque::join — Reúne todos los valores en un string
- Ds\Deque::jsonSerialize — Devuelve una representación que puede ser convertida en JSON
- Ds\Deque::last — Devuelve el último valor
- Ds\Deque::map — Devuelve el resultado de la aplicación de una retrollamada a cada valor
- Ds\Deque::merge — Devuelve el resultado de la adición de todos los valores dados al deque
- Ds\Deque::pop — Elimina y devuelve el último valor
- Ds\Deque::push — Añade valores al final del deque
- Ds\Deque::reduce — Reduce el deque a un solo valor utilizando una función de retrollamada
- Ds\Deque::remove — Elimina y devuelve un valor por índice
- Ds\Deque::reverse — Invierte el deque en su lugar
- Ds\Deque::reversed — Devuelve una copia invertida
- Ds\Deque::rotate — Rota el deque un cierto número de rotaciones
- Ds\Deque::set — Actualiza un valor en un índice dado
- Ds\Deque::shift — Elimina y devuelve el primer valor
- Ds\Deque::slice — Devuelve un sub-deque de un rango dado
- Ds\Deque::sort — Ordena el deque en su lugar
- Ds\Deque::sorted — Devuelve una copia ordenada
- Ds\Deque::sum — Devuelve la suma de todos los valores del deque
- Ds\Deque::toArray — Convierte el deque en un array
- Ds\Deque::unshift — Añade valores al inicio del deque

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open