1.9 컨테이너 어댑터
지금까지 살펴본 컨테이너는 완전히 바닥부터 만들어졌습니다. 이 절에서는 이미 존재하는 컨테이너를 기반으로 만들어진 컨테이너에 대해 알아보겠습니다. 기존 컨테이너를 감싸는 래퍼를 제공하는 데에는 몇 가지 이유가 있습니다. 코드에 좀 더 의미를 부여하고 싶거나, 의도하지 않는 함수를 실수로 사용하지 못하도록 제한하고 싶거나, 또는 특별한 인터페이스를 새롭게 제공하고 싶은 경우가 대표적입니다.
이러한 자료 구조 중의 하나가 스택(stack)입니다. 스택은 데이터 처리와 보관을 위해 LIFO(Last In First Out, 후입선출) 구조를 사용합니다. 기능적인 측면에서 스택은 컨테이너의 한쪽 끝에서만 데이터를 삽입하거나 삭제할 수 있으며, 한쪽 끝이 아닌 위치에 있는 데이터는 접근하거나 변경할 수 없습니다. 벡터나 덱은 이러한 기능을 기본적으로 지원하기 때문에 스택을 구현하기 위한 용도로 사용할 수 있습니다. 그러나 벡터나 덱을 직접 스택처럼 사용하기에는 약간의 문제가 있습니다.
다음 예제 코드는 두 가지의 스택 구현 방법을 보여줍니다.
std::deque<int> stk1;
stk1.push_back(1); // 스택에 1 추가: {1}
stk1.push_back(2); // 스택에 2 추가: {1, 2}
stk1.pop_back(); // 스택에서 맨 위 원소 제거: {1}
stk1.push_front(0); // 원래 스택에서는 지원하지 않는 동작입니다.: {0, 1}
std::stack<int> stk2;
stk2.push(1); // 스택에 1 추가: {1}
stk2.push(2); // 스택에 2 추가: {1, 2}
stk2.pop(); // 스택에서 맨 위 원소 제거: {1}
stk2.push_front(0); // 컴파일 에러!