Usa il contenitore deque in C++
-
Usa il contenitore
std::deque
per elaborare le operazioni di inserimento / rimozione della coda veloce -
Usa i metodi
std::push_back
/std::push_front
per inserire elementi instd::deque
-
Usa la funzione wrapper per il metodo
push_front
per implementare code di dimensioni fisse
Questo articolo mostrerà diversi metodi su come utilizzare il contenitore std::deque
in C++.
Usa il contenitore std::deque
per elaborare le operazioni di inserimento / rimozione della coda veloce
std::deque
implementa una coda a doppia estremità che fornisce operazioni di inserimento e cancellazione a tempo costante alle sue estremità. Pertanto, questa struttura di dati dovrebbe essere utilizzata negli scenari in cui tali operazioni costituiscono la maggior parte delle transazioni. Il rovescio della medaglia, gli elementi std::deque
non sono memorizzati in posizioni di memoria consecutive, e necessita di alcune operazioni extra per gestire le operazioni, risultando in più dimensioni degli oggetti rispetto al contenitore std::vector
. L’esempio seguente mostra un deque
di stringhe costruite dall’oggetto vector
. Si noti che si consiglia di aggiungere un nuovo elemento dall’input della stringa utilizzando il metodo 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);
}
Produzione:
[ plie, flie, blie, clie, hlie ]
Usa i metodi std::push_back
/ std::push_front
per inserire elementi in std::deque
std::deque
ha più funzioni incorporate per fornire ricche funzionalità per la manipolazione degli elementi. I più comuni sono i metodi push_back
e push_front
, che aggiungono gli oggetti dati come elementi al lato corrispondente di deque
. Si noti che queste funzioni hanno i loro metodi invertiti per rimuovere gli elementi: pop_back
e pop_front
. Il seguente esempio mostra l’utilizzo di base dei metodi precedenti.
#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);
}
Produzione:
[ plie, flie, blie, clie, alie ]
[ alie, plie, flie, blie, clie, alie ]
[ plie, flie, blie, clie ]
Usa la funzione wrapper per il metodo push_front
per implementare code di dimensioni fisse
Un altro metodo per utilizzare il contenitore std::deque
per operare su di esso come lo stack di dimensioni fisse che memorizza un numero n
di elementi e, quando è pieno, rimuove automaticamente un elemento dal retro ad ogni nuovo inserimento. In questo caso, abbiamo implementato questa funzione racchiudendo i metodi push_front
e pop_back
in una funzione separata. Si noti che la stessa funzionalità può essere ottenuta anche utilizzando l’adattatore del contenitore std::stack
, ampiamente descritto in questa pagina.
#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);
}
Produzione:
[ 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