[C++] iterator
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임
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