Utilizar el contenedor deque en C++
-
Utilizar el contenedor
std::deque
para procesar operaciones rápidas de inserción/extracción de colas -
Utilizar los métodos
std::push_back
/std::push_front
para insertar elementos enstd::deque
-
Utilizar la función envolvente del método
push_front
para implementar una cola de tamaño fijo
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 ]
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