Usa il contenitore deque in C++

Jinku Hu 12 ottobre 2023
  1. Usa il contenitore std::deque per elaborare le operazioni di inserimento / rimozione della coda veloce
  2. Usa i metodi std::push_back / std::push_front per inserire elementi in std::deque
  3. Usa la funzione wrapper per il metodo push_front per implementare code di dimensioni fisse
Usa il contenitore deque in C++

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 ]
Autore: 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