reverse_iterator

42_Cursus·2022년 5월 17일
0

STL_Containers

목록 보기
7/13

reverse_iterator

https://www.cplusplus.com/reference/iterator/reverse_iterator/

1. class template


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>
{
	// ...
}

2. member types

iterator_traits를 이용하여, 타입변수로받은 iterator를 통해, 멤버 타입을 설정한다.

3. member value

protected:
	iterator_type	_current;

변수로 받은 iterator를 이용하여, operator 연산자함수를 만든다.

4. contructor

다음이 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);

5. base()

타입 변수로 들어온 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;
 }

6. opeator*

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);
}

7. operator +, ++, -...

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;
}

8. operator->

*로 접근후에 &로 받아야함

예)

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;
}

9. operator[]

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;
}

10. non-member function


	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;
}
profile
etudiant_42

0개의 댓글