std::inserter
개요
std::inserter
는 C++ 표준 라이브러리의 반복자 어댑터로, 알고리즘이 컨테이너의 특정 위치에 요소를 삽입할 수 있게 해주는 삽입 반복자(insert iterator)를 생성합니다. 이는 표준 알고리즘들이 기존 요소를 덮어쓰는 대신 컨테이너에 새 요소를 삽입할 수 있게 해줍니다.
C++ 버전별 주요 키워드 도입 시기
- C++98: 최초 도입
- C++11: 우측값 참조와 이동 의미론 지원
- C++17:
insert_iterator
에 대한 CTAD(Class Template Argument Deduction) 지원
내용 설명
std::inserter
는 두 개의 인자를 받는 함수 템플릿입니다:
- 컨테이너: 요소가 삽입될 컨테이너
- 위치: 삽입이 발생할 위치를 가리키는 반복자
std::inserter
는 std::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
활용팁
std::inserter
는 컨테이너의 중간에 요소를 삽입해야 할 때 유용합니다.std::back_inserter
와std::front_inserter
는 각각 컨테이너의 끝과 시작 부분에 삽입하는 특수한 경우에 사용할 수 있습니다.std::inserter
는 연관 컨테이너와 함께 사용할 때 삽입 위치가 힌트로만 사용되므로, 정렬 순서를 유지한 채 삽입됩니다.- C++17 이후로는 클래스 템플릿 인자 추론(CTAD)을 지원하므로
std::inserter
를 더 간결하게 사용할 수 있습니다. - 대용량 데이터를 다룰 때는 삽입 위치 이후의 요소들을 이동해야 하므로 성능에 주의해야 합니다.
'개발 > C++ (98,03,11,14,17,20,23)' 카테고리의 다른 글
Modern C++ : Custom Iterator Utilities (98, 11, 17, 20) (0) | 2025.08.29 |
---|---|
Modern C++ : iterators (98, 11, 17, 20) (0) | 2025.08.27 |
Modern C++ : type aliases (typedef and using) (98, 11) (0) | 2025.08.26 |
Modern C++ : std::map (98, 11, 17, 20) (0) | 2025.08.25 |
Modern C++ : std::pair, std::tuple (98, 11, 17) (0) | 2025.08.24 |
Modern C++ : std::span (20) (1) | 2025.08.23 |
Modern C++ : std::vector, emplace_back vs push_back (98, 11, 17) (0) | 2025.08.22 |
Modern C++ : std::vector (98, 11, 14, 17, 20) (0) | 2025.08.21 |