본문 바로가기
개발/C++ (98,03,11,14,17,20,23)

Modern C++ : std::inserter (98, 11, 17)

by snowoods 2025. 8. 28.

Modern C++

std::inserter

 

개요

std::inserter는 C++ 표준 라이브러리의 반복자 어댑터로, 알고리즘이 컨테이너의 특정 위치에 요소를 삽입할 수 있게 해주는 삽입 반복자(insert iterator)를 생성합니다. 이는 표준 알고리즘들이 기존 요소를 덮어쓰는 대신 컨테이너에 새 요소를 삽입할 수 있게 해줍니다.

 

C++ 버전별 주요 키워드 도입 시기

  • C++98: 최초 도입
  • C++11: 우측값 참조와 이동 의미론 지원
  • C++17: insert_iterator에 대한 CTAD(Class Template Argument Deduction) 지원

 

내용 설명

std::inserter는 두 개의 인자를 받는 함수 템플릿입니다:

  1. 컨테이너: 요소가 삽입될 컨테이너
  2. 위치: 삽입이 발생할 위치를 가리키는 반복자

std::inserterstd::insert_iterator 객체를 반환하며, 이 반복자는 할당 연산자(=)가 호출될 때마다 컨테이너의 insert() 멤버 함수를 호출합니다.

std::inserter를 사용할 때 주의할 점:

  • 컨테이너는 insert() 멤버 함수를 제공해야 합니다.
  • 삽입 위치가 컨테이너의 end()를 넘지 않아야 합니다.
  • 연관 컨테이너의 경우 삽입 위치는 힌트로만 사용됩니다.

 

예제 코드

#include <iostream>
#include <iterator>
#include <vector>

int main()
{
    const auto my_vector = std::vector{0, 1, 2, 3, 4, 5};
    auto my_result1 = std::vector<int>{-1, -2};
    auto my_result2 = std::vector<int>{11, 12};

    // container must implement "insert"
    std::copy(my_vector.begin(),
              my_vector.end(),
              std::inserter(my_result1, std::next(my_result1.begin())));
    for (const auto val : my_result1)
        std::cout << val << " ";
    std::cout << '\n';
    my_result1.clear();

    // container must implement "push_back"
    std::copy(my_vector.begin(),
              my_vector.end(),
              std::back_inserter(my_result2));
    for (const auto val : my_result2)
        std::cout << val << " ";
    std::cout << '\n';
    my_result2.clear();

    return 0;
}

 

실행 결과

-1 0 1 2 3 4 5 -2 
11 12 0 1 2 3 4 5 

 

활용팁

  1. std::inserter는 컨테이너의 중간에 요소를 삽입해야 할 때 유용합니다.
  2. std::back_inserterstd::front_inserter는 각각 컨테이너의 끝과 시작 부분에 삽입하는 특수한 경우에 사용할 수 있습니다.
  3. std::inserter는 연관 컨테이너와 함께 사용할 때 삽입 위치가 힌트로만 사용되므로, 정렬 순서를 유지한 채 삽입됩니다.
  4. C++17 이후로는 클래스 템플릿 인자 추론(CTAD)을 지원하므로 std::inserter를 더 간결하게 사용할 수 있습니다.
  5. 대용량 데이터를 다룰 때는 삽입 위치 이후의 요소들을 이동해야 하므로 성능에 주의해야 합니다.