HOWTO · C++
Verwendung von STL-Stack-Container in C++
In diesem Artikel wird die Verwendung von STL-Stack-Containern in C++ vorgestellt
Dieser Artikel zeigt mehrere Methoden zur Verwendung des STL-stack-Containers in C++.
Verwenden Sie std::stack, um ein Stack-Container-Objekt in C++ zu deklarieren
std::stack wird als Container-Adapter bezeichnet, der als Wrapper von Standard-Containern fungieren kann, aber begrenzte und spezielle Funktionen bietet. Als Beispiel bietet die Klasse std::stack eine LIFO-Datenstruktur (last-in, first-out) und kann auf einen darunter liegenden std::vector- oder std::deque-Container abgebildet werden. std::stack kann mit einem anderen stack-Objekt oder kompatiblen Sequenzcontainern wie deque, vector und list initialisiert werden. Beachten Sie jedoch, dass der Standardcontainer, der zum Speichern der stack-Elemente verwendet wird, deque ist. Außerdem gibt es keinen Konstruktor, der die direkte Übergabe der Initialisierungsliste oder der Elemente unterstützt. Wir müssen die push-Methode verwenden, sobald das stack-Objekt deklariert wurde.
Beachten Sie, dass das stack-Objekt nicht mit der bereichsbasierten Schleife iteriert werden kann. Daher implementieren wir eine spezielle while-Schleife, um jedes Element in den cout-Stream auszugeben. Die Funktion printStack nimmt das Argument stack, aber st1, das vom vector-Objekt initialisiert wurde, kann nicht an sie übergeben werden, da sich die Typen dieser beiden Objekte unterscheiden und der Compiler den Fehler ausgibt.
#include <iostream>
#include <stack>
#include <vector>
using std::cout;
using std::endl;
using std::stack;
using std::vector;
template <typename T>
void printStack(stack<T> s) {
while (!s.empty()) {
cout << s.top() << "; ";
s.pop();
}
cout << endl;
}
int main() {
vector<int> vec1 = {1, 2, 3, 4, 11};
stack st1{vec1};
stack<int> st2;
for (int i = 1; i <= 10; ++i) {
st2.push(i * 12);
}
// printStack(st1); Error - no matching function
printStack(st2);
return EXIT_SUCCESS;
}
Verwenden Sie die Funktion top(), um auf das zuletzt hinzugefügte Element in C++ zuzugreifen
Die Funktion top() ist eine Member-Funktion, die das oberste Element im Stack zurückgibt. Beachten Sie, dass diese Funktion ein zurückgegebenes Element nicht automatisch aus dem stack-Objekt entfernt. Man sollte die Member-Funktion pop aufrufen, um sie zu entfernen.
#include <iostream>
#include <stack>
using std::cout;
using std::endl;
using std::stack;
int main() {
stack<int> st2;
for (int i = 1; i <= 10; ++i) {
st2.push(i * 12);
}
cout << "top of the stack st2: ";
cout << st2.top() << endl;
return EXIT_SUCCESS;
}
Ausgabe:
top of the stack st2: 120
Verwenden Sie die Funktion swap(), um den Inhalt von zwei Stapeln in C++ auszutauschen
Die Funktion swap() ist eine Memberfunktion des Containers stack. Es nimmt eine Referenz auf das Objekt stack und tauscht Elemente aus diesen Stapeln aus. Beachten Sie, dass das Objekt st1, das mit dem Objekt vector initialisiert wird, weder die Funktion swap() aufrufen oder ein Argument dafür sein kann. Damit der containerinitialisierte stack mit der Funktion swap verwendet werden kann, muss er mit dem std::move-Aufruf erstellt werden, da im folgenden Codebeispiel das st3-Objekt initialisiert wird. Letzteres kann auch problemlos an die Funktion printStack übergeben werden. Schließlich tauschen wir Elemente von st2/st3-Stack-Objekten aus und geben die Ergebnisse an die Konsole aus.
#include <deque>
#include <iostream>
#include <stack>
#include <vector>
using std::cout;
using std::deque;
using std::endl;
using std::stack;
using std::vector;
template <typename T>
void printStack(stack<T> s) {
while (!s.empty()) {
cout << s.top() << "; ";
s.pop();
}
cout << endl;
}
int main() {
deque<int> deq1 = {11, 12, 13, 14};
vector<int> vec1 = {1, 2, 3, 4, 11};
stack st1{vec1};
stack<int> st2;
for (int i = 1; i <= 10; ++i) {
st2.push(i * 12);
}
// st2.swap(st1); Error
stack<int> st3{std::move(deq1)};
printStack(st2);
printStack(st3);
st2.swap(st3);
printStack(st2);
printStack(st3);
return EXIT_SUCCESS;
}
Ausgabe:
120; 108; 96; 84; 72; 60; 48; 36; 24; 12;
14; 13; 12; 11;
14; 13; 12; 11;
120; 108; 96; 84; 72; 60; 48; 36; 24; 12;