본문 바로가기
프로그래밍/C++

STL) inserter, back_inserter, front_inserter 반복자 어댑터(Iterator Adaptor)

by 워킹독 2022. 12. 14.
728x90

 

대부분의 Dest의 Iterator를 받는 알고리즘들(copy(), transform(), 집합 연산 등등) 은 그 컨테이너가 공간 요소를 넣기에 충분한 용량 ( capacity ) 를 확보해야한다.

그렇기 때문에 사이즈를 여유있게 할당한 뒤에 결과에 따라 resize하는 경우가 발생하는데, 이러한 번거로운 작업을 줄여주기 위해 만들어 진 것이 반복자 어댑터(Iterator Adaptor)이다.

 

3가지 종류가 있고 상황에 맞게 사용하면 됨

  1. inserter()
  2. back_inserter()
  3. front_inserter() 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
std::vector<int> vec{ 1,2,3,4,5 };
 
// resize을 통한 복사
std::vector<int> copyVec_origin;
copyVec_origin.resize(vec.size());
std::copy(vec.begin(), vec.end(), copyVec_origin.begin());
 
// 1. std::inserter()
std::vector<int> copyVec1;
std::copy(vec.begin(), vec.end(), std::inserter(copyVec1, copyVec1.begin()));
// 내부에선 copyVec1.insert(vec.begin(), vec.begin() +1... 이 될 것)
// back_inserter과 동일한 결과 -> 1, 2, 3, 4, 5
 
// 2. std::back_inserter()
std::vector<int> copyVec2;
std::copy(vec.begin(), vec.end(), std::back_inserter(copyVec2));
// push_back()을 사용해서 1, 2, 3, 4, 5 삽입
 
 
// 3. std::front_inserter()
// (※front_inserter가 존재하는 구조에서 사용해야함 (vector는 front_inserter가 없음!))
std::list<int> copylist1;
std::copy(vec.begin(), vec.end(), std::front_inserter(copylist1));
// 5, 4, 3, 2, 1 -> 내부에선 push_front()를 호출함
cs

 

잘 활용해서 사용해보자

 

함수 라이브러리

 

std::inserter - cppreference.com

template< class Container > std::insert_iterator inserter( Container& c, typename Container::iterator i ); (until C++20) (since C++20) inserter is a convenience function template that constructs a std::insert_iterator for the container c and its iterator i

en.cppreference.com

 

 

728x90
반응형

댓글