https://www.cplusplus.com/reference/iterator/reverse_iterator/
class reverse_iterator : public ft::iterator<
typename ft::iterator_traits<Iterator>::iterator_category,
typename ft::iterator_traits<Iterator>::value_type,
typename ft::iterator_traits<Iterator>::difference_type,
typename ft::iterator_traits<Iterator>::pointer,
typename ft::iterator_traits<Iterator>::reference>
{
// ...
}
iterator_traits를 이용하여, 타입변수로받은 iterator를 통해, 멤버 타입을 설정한다.
protected:
iterator_type _current;
변수로 받은 iterator를 이용하여, operator 연산자함수를 만든다.
다음이 iterator일때,
typedef std::vector<int>::iterator iter_type;
reverse_iterator는
//default (1) 아무것도 받지않는다.
reverse_iterator();
std::reverse_iterator<iter_type> rev_it;
//initialization (2) 일반 iterator를 받는다.
explicit reverse_iterator (iterator_type it);
iter_type vItr(myvector.begin());
std::reverse_iterator<iter_type> rev_it(vItr);
// avec "explicit"
std::reverse_iterator<iter_type> rev_it = vItr;
// compile error
//copy (3) reverse_iterator를 받는다.
// 템플릿 타입변수가 인수 reverse_iterator의
// 타입변수와 같아야한다.
template <class Iter>
reverse_iterator (const reverse_iterator<Iter>& rev_it);
std::reverse_iterator<iter_type> newRevItr(rev_it);
타입 변수로 들어온 iterator 반환.
또한, 외부에서 iterator로 접근하기위해 사용.
/*
iterator_type base() const
{
return (this->_current);
}
*/
int main () {
std::vector<int> myvector;
for (int i=0; i<10; i++) myvector.push_back(i);
typedef std::vector<int>::iterator iter_type;
std::reverse_iterator<iter_type> rev_end (myvector.begin());
std::reverse_iterator<iter_type> rev_begin (myvector.end());
/* base() */
for (iter_type it = rev_end.base(); it != rev_begin.base(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
vector가 0에서 10까지 연속되어있다고 가정할때,
0은 iterator의 begin, 10의 다음값이 end값이다.
0(begin) 1 2 3 4 5 6 7 8 9 10 ?(end)
reverse_iterator의 begin과 end는
begin = 10, end는 0이전의 값이어야한다.
그렇기때문에, tmp을 만든후에 iter를 뒤로
옮겨야한다.
reference operator*() const
{
iterator_type tmp(_current);
tmp--;
return (*tmp);
}
reverse_iterator에서 ++증가는, _current의 -- 와 같다.
예)
reverse_iterator operator+(difference_type n) const
{
return (reverse_iterator(this->_current - n));
}
reverse_iterator& operator++()
{
--_current;
return (*this);
}
reverse_iterator operator++(int)
{
reverse_iterator tmp = *this;
_current--;
return tmp;
}
*로 접근후에 &로 받아야함
예)
pointer operator->() const
{
return (&(operator*()));
}
int main () {
std::map<int,std::string> numbers;
numbers.insert (std::make_pair(1,"one"));
numbers.insert (std::make_pair(2,"two"));
numbers.insert (std::make_pair(3,"three"));
typedef std::map<int,std::string>::iterator map_iter;
std::reverse_iterator<map_iter> rev_end (numbers.begin());
std::reverse_iterator<map_iter> rev_iterator (numbers.end());
for ( ; rev_iterator != rev_end ; ++rev_iterator )
std::cout << rev_iterator->first << ' ' << rev_iterator->second << '\n';
return 0;
}
reference operator[] (difference_type n) const
{
return (*(_current - n - 1));
}
int main () {
std::vector<int> myvector;
for (int i=0; i<10; i++) myvector.push_back(i); // myvector: 0 1 2 3 4 5 6 7 8 9
typedef std::vector<int>::iterator iter_type;
std::reverse_iterator<iter_type> rev_iterator = myvector.rbegin();
std::cout << "The fourth element from the end is: " << rev_iterator[3] << '\n';
return 0;
}
template<class Iter1, class Iter2>
bool operator==(const reverse_iterator<Iter1>& lhs,
const reverse_iterator<Iter2>& rhs)
{
return (lhs.base() == rhs.base());
}
// ==, !=, >= ...
template <typename Iterator>
reverse_iterator<Iterator> operator+(
typename reverse_iterator<Iterator>::difference_type n,
const reverse_iterator<Iterator> &it) {
return (reverse_iterator<Iterator>(it.base() - n));
}
int main () {
std::vector<int> myvector;
for (int i=0; i<10; i++) myvector.push_back(i);
typedef std::vector<int>::iterator iter_type;
std::reverse_iterator<iter_type> rev_it;
// n + it
rev_it = 3 + myvector.rbegin();
// 만약,
rev_it = myvector.rbegin() + 3;
// 이건, 템플릿내부 operator가 호출됨
/*
reverse_iterator operator+(difference_type n) const;
*/
std::cout << "The fourth element from the end is: " << *rev_it << '\n';
return 0;
}