이 글에서는 C++ STL에서 제공하는 stack::emplace() 함수의 동작 방식, 문법, 그리고 실제 예제를 자세히 살펴보겠습니다.
C++ STL에서 스택(Stack)이란?
스택은 LIFO(Last In First Out, 후입선출) 방식으로 데이터를 저장하는 자료구조입니다. 즉, 마지막에 삽입된 요소가 가장 먼저 삭제되며, 삽입과 삭제는 모두 스택의 맨 위(top)에서 이루어집니다.
접시를 쌓아 올린 모습을 떠올리면 쉽게 이해할 수 있습니다. 새 접시를 쌓으려면 가장 위에 올리고, 접시를 꺼낼 때도 가장 위에 있는 것부터 꺼내는 것과 같습니다.
stack::emplace()란 무엇인가?
stack::emplace() 함수는 C++ STL에 내장된 함수로, <stack> 헤더 파일에 정의되어 있습니다. 이 함수는 해당 스택 컨테이너에 새로운 요소를 직접 생성(construct)하여 삽입하는 역할을 합니다.
이 함수가 호출되면 스택의 맨 위에 새 요소가 삽입되고, 새로 삽입된 요소가 곧 스택의 top 요소가 됩니다. 내부적으로는 emplace_back을 호출하여 새 요소를 맨 위에 추가합니다.
일반적인 push()와 달리, emplace()는 객체를 미리 만든 후 복사하는 대신 전달받은 인자를 사용해 컨테이너 안에서 객체를 직접 생성하므로, 불필요한 복사 비용을 줄여 성능상 이점을 얻을 수 있습니다.
문법(Syntax)
stack_name.emplace(args);
매개변수
args − 스택에 삽입하고자 하는 요소를 생성하기 위한 인자입니다.
반환값
이 함수는 아무 값도 반환하지 않습니다(void).
간단한 입력 예시
입력
std::stack<int> stack1; stack1.emplace(1); stack1.emplace(2); stack1.emplace(3);
출력
3 2 1
예제 1: emplace()로 요소 삽입 후 출력
#include <iostream>
#include <stack>
using namespace std;
int main(){
stack<int> stck;
stck.emplace(10);
stck.emplace(20);
stck.emplace(30);
stck.emplace(40);
stck.emplace(50);
stck.emplace(60);
cout << "스택에 저장된 요소들: ";
while (!stck.empty()){
cout << stck.top() << " ";
stck.pop();
}
return 0;
}출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
스택에 저장된 요소들: 60 50 40 30 20 10
가장 나중에 삽입한 60이 가장 먼저 출력되는 것을 통해 LIFO 구조를 확인할 수 있습니다.
예제 2: 스택에 저장된 요소 개수 세기
#include <iostream>
#include <stack>
using namespace std;
int main(){
stack<int> stck;
int total = 0;
stck.emplace(10);
stck.emplace(20);
stck.emplace(30);
stck.emplace(40);
stck.emplace(50);
stck.emplace(60);
cout << "스택에 저장된 요소들: ";
while (!stck.empty()){
cout << stck.top() << " ";
stck.pop();
total++;
}
cout << "\n스택에 저장된 총 요소 개수: " << total;
return 0;
}출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
스택에 저장된 요소들: 60 50 40 30 20 10 스택에 저장된 총 요소 개수: 6
정리
stack::emplace()는 스택의 맨 위에 새 요소를 효율적으로 생성·삽입하는 함수입니다. 반환값이 없으며, 복사 오버헤드를 줄일 수 있어 특히 사용자 정의 클래스 객체를 다룰 때 유용하게 활용할 수 있습니다.