Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ STL deque emplace() 함수 완벽 가이드

C++ STL에서 deque의 emplace( ) 함수가 어떤 기능을 수행하는지 자세히 알아보겠습니다.

덱(Deque)이란?

덱(Double Ended Queue, 양방향 큐)은 양쪽 끝에서 모두 요소를 추가하거나 제거할 수 있는 시퀀스 컨테이너입니다. 일반적인 큐(Queue) 자료구조는 데이터를 뒤쪽(END)에서만 삽입하고 앞쪽(FRONT)에서만 삭제할 수 있습니다. 버스 정류장의 줄을 떠올려 보면 쉽게 이해할 수 있습니다. 새로운 사람은 항상 줄의 맨 뒤에서만 들어오고, 맨 앞에 서 있는 사람부터 차례로 빠져나갑니다. 반면 양방향 큐인 덱은 양쪽 끝 어느 쪽에서든 데이터의 삽입과 삭제가 모두 가능합니다.

emplace( ) 함수란?

emplace( ) 함수는 덱에서 지정한 위치 바로 앞에 새 요소를 삽입하며, 요소가 추가된 만큼 덱의 크기도 늘어납니다. 내부적으로 전달받은 인자로 새 요소를 직접 생성(construction)하기 때문에 불필요한 복사나 이동 과정 없이 효율적으로 삽입할 수 있다는 장점이 있습니다.

구문

iterator emplace(const_iterator position, value_type value);

매개변수

position − 컨테이너에서 새 요소를 삽입할 위치를 지정합니다.

value − 컨테이너에 삽입할 새로운 값 또는 인자를 지정합니다.

반환 값 − 새로 삽입된 요소를 가리키는 반복자(iterator)를 반환합니다.

예시 입출력

입력 Deque − 96 97 98 100
출력 새 요소 삽입 후 − 96 97 98 99 100

입력 Deque − C P T A I N
출력 새 요소 삽입 후 − C A P T A I N

구현 접근 방식

  • 먼저 덱을 선언하고 초기화합니다.
  • 초기 덱의 내용을 출력합니다.
  • emplace( ) 함수를 호출하여 삽입 위치와 새로운 값을 지정합니다.
  • 새 요소가 삽입된 덱을 다시 출력합니다.

위 접근 방식을 활용하면 덱에 새 요소를 손쉽게 삽입할 수 있습니다. emplace( ) 함수를 호출할 때는 삽입할 위치와 함께 새로운 값을 인자로 함께 전달해야 합니다.

예제 1: 숫자 덱에 요소 삽입

// C++ 코드로 deque emplace( ) 함수의 동작 확인하기
#include <iostream>
#include <deque>
using namespace std;

int main() {
    // 덱 초기화
    deque<int> d = { 85, 87, 88, 89, 90 };

    // 덱 출력
    cout << "Deque: ";
    for (auto x = d.begin(); x != d.end(); ++x)
        cout << *x << " ";

    // emplace( ) 함수로 두 번째 위치에 86 삽입
    d.emplace(d.begin() + 1, 86);

    // 새 요소 삽입 후 덱 출력
    cout << "\nNew Deque: ";
    for (auto x = d.begin(); x != d.end(); ++x)
        cout << *x << " ";

    return 0;
}

출력 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

Input - Deque: 85 87 88 89 90
Output - New Deque: 85 86 87 88 89 90

예제 2: 문자 덱의 맨 앞에 요소 삽입

// C++ 코드로 deque emplace( ) 함수의 동작 확인하기
#include <iostream>
#include <deque>
using namespace std;

int main() {
    // 문자 덱 초기화
    deque<char> d = { 'L', 'A', 'C', 'K' };

    cout << "Deque: ";
    for (auto x = d.begin(); x != d.end(); ++x)
        cout << *x << " ";

    // emplace( ) 함수로 맨 앞에 'B' 삽입
    d.emplace(d.begin(), 'B');

    // 새 요소 삽입 후 덱 출력
    cout << "\nNew Deque: ";
    for (auto x = d.begin(); x != d.end(); ++x)
        cout << *x << " ";

    return 0;
}

출력 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

Input – Deque: L A C K
Output – New Deque: B L A C K

emplace( )와 insert( )의 차이점

insert( ) 함수는 이미 존재하는 객체를 복사하거나 이동하여 컨테이너에 삽입하는 반면, emplace( ) 함수는 전달받은 인자를 사용해 컨테이너 내부에서 객체를 직접 생성합니다. 따라서 임시 객체 생성 및 복사에 드는 비용을 줄일 수 있어, 특히 무거운 객체를 다룰 때 성능 면에서 유리합니다.