<언어>/[C++]

[C++] iterator

콜리브리 2020. 9. 5. 14:27

https://en.cppreference.com/w/cpp/algorithm/adjacent_difference

 

std::adjacent_difference - cppreference.com

(1) template< class InputIt, class OutputIt > OutputIt adjacent_difference( InputIt first, InputIt last,                               OutputIt d_first ); (until C++20) template< class InputIt, class OutputIt > constexpr OutputIt adjacent_di

en.cppreference.com

예시에서 iterator 다루는 법 보기.

 

prev, next 등.

 

마치 linked list 처럼 앞 뒤로 연결된 느낌 아니냐?

 

 

- iter_swap : swap인데, 대신 iterator 넣어서, iter가 pointing중인 원소를 swap해버림

 

 

Iterator 몇 칸 앞/뒤로 옮기기

std::advance

: modifies argument

 

std::next, std::prev

: returns new iter with modification

 

차이

https://stackoverflow.com/questions/671423/c-stl-vectors-get-iterator-from-index%EF%BB%BF

 

이걸 어따가 쓰죠?

→ 특정 원소의 index만 있고, 이 원소를 가리키는 iterator가 필요할때

stackoverflow.com/questions/671423/c-stl-vectors-get-iterator-from-index

 

// index가 가리키는 iterator
auto iter = next(v.begin(), idx);

// iterator가 가리키는 index
int idx = distance(v.begin(), iter);

 

 

reverse iterator

iter-- 할 필요 없이, reverse_iter++ 해서 reverse iteration 가능

// 배열 앞 부분에 나보다 큰 숫자가 있으면 maxSj에 기록
int maxSj = -INF;
for(auto it = nums.rbegin(); it != nums.rend(); it++){
    auto last = it.base()-1; // ★ -1 빼는 이유는 base 특수성
    auto found = upper_bound(nums.begin(), last, maxSj);
    if (found != last) maxSj = max(maxSj, *found);
}

그림 보고 이해하자. 여기선 rend가 invalid임

https://en.cppreference.com/w/cpp/iterator/reverse_iterator

 

 

Conversion

iterator → reverse_iterator : std::make_reverse_iterator

reverse_iterator → iterator : std::reverse_iterator<Iter>::base

 

주의) base는 reverse iter의 한칸 뒤 iterator를 반환해주는데, 왜 그런지는 아래 링크 참고

http://egloos.zum.com/sweeper/v/2970390

 

reverse_iterator와 base()

우선 STL의 네 가지 iterator는 다음과 같다. iteratorconst_iteratorreverse_iteratorconst_reverse_iterator 이들간의 변환 구조는 다음과 같은 그림을 그리게 된다. 위 그림에서 검은 실선은 암묵적 형변환이 가능

egloos.zum.com

reverse_iterator와 base().mhtml
0.30MB