본문 바로가기

Lang/C++

[C++] 컨테이너 어댑터 Stack

728x90

컨테이너 어댑터란?

기존 컨테이너의 기능을 제한하거나 변형한 컨테이너를 만들어줍니다.

 

 

STL의 컨테이너 어댑터 종류.

컨테이너 어댑터 설명
스택 ( stack) LIFO ( Last In First Out ) 나중에 삽입된 요소가 먼저 반환됩니다.
큐 (queue) FIFO ( First In First Out ) 먼저 삽입된 요소가 먼저 반환됩니다.
우선순위 큐 (Priority queue) 우선 순위가 높은 요소를 먼저 반환합니다.

 

 

# stack의 멤버 함수

멤버 함수 설명
push(x) stack의 상단에 값 x를가진 요소를 추가한다.
pop() stack 상단의 요소를 제거한다.
top() stack 상단 요소의 값을 읽어 레퍼런스로 리턴한다.
size() stack의 사이즈를 리턴합니다.
empty() stack에 요소가 하나도 없이 비어있으면 참을 리턴합니다.
emplace(x) push(x)와 같음. 
swap(myStack2) 같은 유형 스택인 myStack2와 요소를 전부 교환합니다.

* emplace()는 오래된 버전의 STL에서 작동하지 않을 수 있습니다. 최신 버전의 visual studio에서 테스트해보시길 권장합니다.

 

 

# stack 사용 예제

#include <iostream>
#include <stack>
using namespace std;
int main()
{
    stack<int> s;

    s.push(11);	// 삽입
    s.push(22);
    s.emplace(99);
    s.push(33);
    s.push(44);

    cout << "size: " << s.size() << endl;	// 사이즈 확인
    cout << "empty? : " << s.empty() << endl;	// 비어있는지 확인

    while (!s.empty()) {
        cout << s.top() << endl;	// 값 참조
        s.pop();			// 요소 제거
    }

    cout << "empty? : " << s.empty() << endl;

    return 0;
}

 

 

- pop()

* pop 함수가 값이나 레퍼런스를 리턴하지 않는 이유

시스템 스택을 비롯한 일반적인 스택은 pop함수가 값을 리턴하면서 제거하도록 되어있는데, STL의 스택은 읽는 함수인 top 함수와 제거 함수인 pop 함수가 분리되어 있습니다.

이것은 스택이 임의의 타입에 대해서도 동작해야 하기 때문입니다.

시스템 스택처럼 값을 리턴하기에는 int나 double같은 기본적인 타입은 괜찮지만
사용자 정의 타입의 값을 복사하기 시작하면 효율이 너무나 좋지 않습니다.

레퍼런스로 리턴하기에는 제거한 요소를 가리키는 레퍼런스를 리턴하는 것이기 때문에 의미가 없습니다.

따라서 STL의 스택은 레퍼런스를 리턴하는 top 함수와
요소를 제거하는 pop 함수를 분리하여 제공합니다.
728x90

'Lang > C++' 카테고리의 다른 글

[C++] STL 연관 컨테이너 Map  (0) 2022.12.01
[C++] 구조체를 확장하면? 클래스!  (0) 2022.11.24
[C++] STL Vector  (0) 2022.11.22