Utiliser STL Stack Container en C++
-
Utilisez
std::stack
pour déclarer l’objet conteneur de pile en C++ -
Utilisez la fonction
top()
pour accéder à l’élément le plus récemment ajouté en C++ -
Utilisez la fonction
swap()
pour échanger le contenu de deux piles en C++
Cet article présentera plusieurs méthodes sur l’utilisation du conteneur STL stack
en C++.
Utilisez std::stack
pour déclarer l’objet conteneur de pile en C++
std::stack
est appelé un adaptateur de conteneur, qui peut agir comme enveloppe de conteneurs standard mais fournit des fonctionnalités limitées et spécialisées. Par exemple, la classe std::stack
fournit une structure de données LIFO (dernier entré, premier sorti) et elle peut être mappée à un conteneur std::vector
ou std::deque
en dessous. std::stack
peut être initialisé avec un autre objet stack
ou des conteneurs de séquence compatibles comme deque
, vector
et list
. Notez, cependant, que le conteneur par défaut utilisé pour stocker les éléments stack
est deque
. De plus, il n’y a pas de constructeur pour prendre en charge la transmission directe de la liste d’initialisation ou des éléments. Nous devons utiliser la méthode push
une fois que l’objet stack
a été déclaré.
Notez que l’objet stack
ne peut pas être itéré en utilisant la boucle basée sur la plage. Ainsi, nous implémentons une boucle spéciale while
pour imprimer chaque élément dans le flux cout
. La fonction printStack
prend l’argument stack
, mais st1
qui a été initialisé par l’objet vector
ne peut pas lui être transmis, car les types de ces deux objets diffèrent et le compilateur renvoie l’erreur.
#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;
}
Utilisez la fonction top()
pour accéder à l’élément le plus récemment ajouté en C++
La fonction top()
est une fonction membre qui renvoie l’élément supérieur de la pile. Notez que cette fonction ne supprime pas automatiquement un élément renvoyé de l’objet stack
. Il faut appeler la fonction membre pop
pour la supprimer.
#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;
}
Production:
top of the stack st2: 120
Utilisez la fonction swap()
pour échanger le contenu de deux piles en C++
La fonction swap()
est une fonction membre du conteneur stack
. Il prend une référence à l’objet stack
et échange les éléments de ces piles. Notez que l’objet st1
, qui est initialisé à l’aide de l’objet vector
, ne peut pas appeler la fonction swap
ou être un argument de celle-ci. Afin de permettre au conteneur initialisé stack
d’être utilisé avec la fonction swap
, il doit être créé à l’aide de l’appel std::move
, car l’objet st3
est initialisé dans l’exemple de code suivant. Ce dernier peut également être passé à la fonction printStack
sans aucun problème. Enfin, nous échangeons les éléments des objets de pile st2
/st3
et imprimons les résultats sur la console.
#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;
}
Production:
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;
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