C++에서 STL 스택 컨테이너 사용
-
std::stack
을 사용하여 C++에서 스택 컨테이너 객체 선언 -
top()
함수를 사용하여 C++에서 가장 최근에 추가 된 요소에 액세스 -
swap()
함수를 사용하여 C++에서 두 스택의 내용 교환
이 기사는 C++에서 STL stack
컨테이너를 사용하는 방법에 대한 여러 방법을 보여줍니다.
std::stack
을 사용하여 C++에서 스택 컨테이너 객체 선언
‘std::stack’은 표준 컨테이너의 래퍼 역할을 할 수 있지만 제한적이고 특수한 기능을 제공하는 컨테이너 어댑터라고합니다. 예를 들어,std::stack
클래스는 LIFO (last-in, firs-out) 데이터 구조를 제공하며 그 아래에있는std::vector
또는std::deque
컨테이너에 매핑 될 수 있습니다. std::stack
은 다른stack
객체 또는deque
,vector
및list
와 같은 호환 가능한 시퀀스 컨테이너로 초기화 할 수 있습니다. 하지만 ‘stack’요소를 저장하는 데 사용되는 기본 컨테이너는 ‘deque’입니다. 또한 이니셜 라이저 목록 또는 요소를 직접 전달하는 것을 지원하는 생성자가 없습니다. stack
객체가 선언되면push
메소드를 사용해야합니다.
stack
객체는 범위 기반 루프를 사용하여 반복 할 수 없습니다. 따라서 각 요소를cout
스트림에 인쇄하기 위해 특별한while
루프를 구현합니다. printStack
함수는stack
인수를 사용하지만vector
객체에 의해 초기화 된st1
은이 두 객체의 유형이 다르고 컴파일러에서 오류가 발생하기 때문에 전달할 수 없습니다.
#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;
}
top()
함수를 사용하여 C++에서 가장 최근에 추가 된 요소에 액세스
top()
함수는 스택의 최상위 요소를 반환하는 멤버 함수입니다. 이 함수는stack
개체에서 반환 된 요소를 자동으로 제거하지 않습니다. 제거하려면pop
멤버 함수를 호출해야합니다.
#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;
}
출력:
top of the stack st2: 120
swap()
함수를 사용하여 C++에서 두 스택의 내용 교환
swap()
함수는stack
컨테이너의 멤버 함수입니다. stack
오브젝트에 대한 참조를 취하고 이러한 스택에서 요소를 교환합니다. vector
객체를 사용하여 초기화 된st1
객체는swap
함수를 호출하거나 함수에 대한 인수가 될 수 없습니다. 컨테이너 초기화stack
을swap
함수와 함께 사용하려면st3
객체가 다음 코드 예제에서 초기화되므로std::move
호출을 사용하여 생성해야합니다. 후자는 문제없이printStack
함수에 전달할 수도 있습니다. 마지막으로st2
/st3
스택 개체의 요소를 교환하고 결과를 콘솔에 인쇄합니다.
#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;
}
출력:
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