Utilizar el contenedor deque en C++

Jinku Hu 12 octubre 2023
  1. Utilizar el contenedor std::deque para procesar operaciones rápidas de inserción/extracción de colas
  2. Utilizar los métodos std::push_back/std::push_front para insertar elementos en std::deque
  3. Utilizar la función envolvente del método push_front para implementar una cola de tamaño fijo
Utilizar el contenedor deque en C++

Este artículo demostrará múltiples métodos sobre cómo utilizar el contenedor std::deque en C++.

Utilizar el contenedor std::deque para procesar operaciones rápidas de inserción/extracción de colas

std::deque implementa una cola de doble extremo que proporciona operaciones de inserción y borrado en tiempo constante en sus extremos. Por lo tanto, esta estructura de datos debería utilizarse en escenarios en los que estas operaciones constituyen la mayor parte de las transacciones. En el lado negativo, los elementos de std::deque no se almacenan en ubicaciones de memoria consecutivas, y necesita alguna operación extra para manejar las operaciones, lo que resulta en un mayor tamaño de los objetos que el contenedor std::vector. El siguiente ejemplo muestra un deque de cadenas construido a partir del objeto vector. Nótese que se recomienda añadir un nuevo elemento de la cadena de entrada utilizando el método emplace_back.

#include <deque>
#include <iostream>
#include <vector>

using std::cout;
using std::deque;
using std::endl;
using std::string;
using std::vector;

template <typename T>
void printElements(deque<T> &d) {
  cout << "[ ";
  for (const auto &item : d) {
    cout << item << ", ";
  }
  cout << "\b\b ]" << endl;
}

int main() {
  vector<string> vec = {"plie", "flie", "blie", "clie"};
  ;

  deque<string> deque2(vec.begin(), vec.end());
  deque2.emplace_back("hlie");
  printElements(deque2);

  exit(EXIT_SUCCESS);
}

Producción :

[ plie, flie, blie, clie, hlie ]

Utilizar los métodos std::push_back/std::push_front para insertar elementos en std::deque

std::deque tiene múltiples funciones incorporadas para proporcionar ricas características para la manipulación de elementos. Las más comunes son los métodos push_back y push_front, que añaden los objetos dados como elementos al lado correspondiente del deque. Observa que estas funciones tienen sus métodos inversos para eliminar los elementos - pop_back y pop_front. El siguiente ejemplo muestra el uso básico de los métodos anteriores.

#include <deque>
#include <iostream>
#include <vector>

using std::cout;
using std::deque;
using std::endl;
using std::string;
using std::vector;

template <typename T>
void printElements(deque<T> &d) {
  cout << "[ ";
  for (const auto &item : d) {
    cout << item << ", ";
  }
  cout << "\b\b ]" << endl;
}

int main() {
  vector<string> vec = {"plie", "flie", "blie", "clie"};
  ;

  deque<string> deque2(vec.begin(), vec.end());

  string str1("alie");
  deque2.push_back(str1);
  printElements(deque2);
  deque2.push_front(str1);
  printElements(deque2);

  deque2.pop_back();
  deque2.pop_front();
  printElements(deque2);

  exit(EXIT_SUCCESS);
}

Producción :

[ plie, flie, blie, clie, alie ]
[ alie, plie, flie, blie, clie, alie ]
[ plie, flie, blie, clie ]

Utilizar la función envolvente del método push_front para implementar una cola de tamaño fijo

Otro método para utilizar el contenedor std::deque para operar en él como la pila de tamaño fijo que almacena n número de elementos, y cuando se llena, elimina automáticamente un elemento de la parte posterior en cada nueva inserción. En este caso, implementamos esta característica envolviendo los métodos push_front y pop_back en una función separada. Ten en cuenta que la misma funcionalidad también se puede conseguir utilizando el adaptador de contenedores std::stack, que se describe ampliamente en esta página.

#include <deque>
#include <iostream>

using std::cout;
using std::deque;
using std::endl;
using std::string;

template <typename T>
void printElements(deque<T> &d) {
  cout << "[ ";
  for (const auto &item : d) {
    cout << item << ", ";
  }
  cout << "\b\b ]" << endl;
}

template <typename T>
void pushElement(T &elem, deque<T> &d) {
  d.push_front(elem);
  d.pop_back();
}

int main() {
  deque<int> deque1 = {3, 5, 7, 9};
  int i1 = 11;

  printElements(deque1);
  pushElement(i1, deque1);
  printElements(deque1);

  exit(EXIT_SUCCESS);
}

Producción :

[ 3, 5, 7, 9 ]
[ 11, 3, 5, 7 ]
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook