Verwendung des deque-Container in C++

Jinku Hu 12 Oktober 2023
  1. Verwendung des std::deque-Containers zur Verarbeitung von schnellen Operationen zum Einfügen/Entfernen von Warteschlangen
  2. Verwenden der Methoden std::push_back/std::push_front zum Einfügen von Elementen in std::deque
  3. Verwendung der Wrapper-Funktion für die Methode push_front zur Implementierung einer Warteschlange mit fester Größe
Verwendung des deque-Container in C++

Dieser Artikel demonstriert mehrere Methoden zur Verwendung des std::deque-Container in C++.

Verwendung des std::deque-Containers zur Verarbeitung von schnellen Operationen zum Einfügen/Entfernen von Warteschlangen

std::deque implementiert eine Warteschlange mit zwei Enden, die Einfüge- und Löschoperationen mit konstanter Zeit an ihren Enden ermöglicht. Daher sollte diese Datenstruktur in Szenarien verwendet werden, in denen solche Operationen den größten Teil der Transaktionen ausmachen. Der Nachteil ist, dass std::deque-Elemente nicht an aufeinanderfolgenden Speicherplätzen gespeichert werden und dass es einige zusätzliche Operationen benötigt, um die Operationen zu verarbeiten, was zu einer größeren Objektgröße als beim std::vector-Container führt. Das folgende Beispiel zeigt eine deque von Zeichenketten, die aus dem vector-Objekt konstruiert wurde. Beachten Sie, dass ein neues Element aus der Zeichenketteneingabe mit der Methode emplace_back hinzugefügt werden sollte.

#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);
}

Ausgabe:

[ plie, flie, blie, clie, hlie ]

Verwenden der Methoden std::push_back/std::push_front zum Einfügen von Elementen in std::deque

std::deque hat mehrere eingebaute Funktionen, die umfangreiche Möglichkeiten zur Elementmanipulation bieten. Die gebräuchlichsten davon sind die Methoden push_back und push_front, die die angegebenen Objekte als Elemente auf der entsprechenden Seite des deque einfügen. Beachten Sie, dass diese Funktionen ihre umgekehrten Methoden zum Entfernen der Elemente haben - pop_back und pop_front. Das folgende Beispiel zeigt die grundlegende Verwendung der oben genannten Methoden.

#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);
}

Ausgabe:

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

Verwendung der Wrapper-Funktion für die Methode push_front zur Implementierung einer Warteschlange mit fester Größe

Eine weitere Methode, den std::deque-Container zu nutzen, um mit ihm als Stapel fester Größe zu operieren, der n Anzahl von Elementen speichert und, wenn er voll ist, bei jedem neuen Einfügen automatisch ein Element von hinten entfernt. In diesem Fall haben wir diese Funktion implementiert, indem wir die Methoden push_front und pop_back in eine separate Funktion verpackt haben. Beachten Sie, dass die gleiche Funktionalität auch mit dem std::stack-Container-Adapter erreicht werden kann, der auf dieser Seite ausführlich beschrieben ist.

#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);
}

Ausgabe:

[ 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