더북(TheBook)

반복자를 위한 템플릿 정의는 다음과 같다.

// 반복자 클래스 템플릿 - 순방향 반복자
template<typename T>
class Numeric_Iterator : public std::iterator <std::forward_iterator_tag, T>
{
  friend class Numeric_Range <T>;
 
private:
  Numeric_Range<T>& range;     // 이 반복자 범위에 대한 참조
  T value;                     // 참조가 가리키는 값
 
public:
  explicit Numeric_Iterator(Numeric_Range<T>& a_range) : range {a_range}, value {a_range.start} {};
 
  // 할당 연산자
  Numeric_Iterator& operator=(const Numeric_Iterator& src)
  {
    range = src.range;
    value = src.value;
  }
 
  // 반복자를 역참조한다
  T& operator*()
  {
    // 값이 마지막에서 하나 더 뒤라면 이 값은 끝 반복자다
    if (value == static_cast<T>(range.start + range.count*range.step))
    {
      throw std::logic_error(“Cannot dereference an end iterator.”);
    }
  return value;
}
  // 전치 증가 연산자
  Numeric_Iterator& operator++()
  {
  // 값이 마지막에서 하나 더 뒤라면 이 값은 끝 반복자다
  if (value == static_cast<T>(range.start + range.count*range.step))
  {
  throw std::logic_error(“Cannot increment an end iterator.”);
  }
  value += range.step; // 범위 스텝만큼 값을 증가
  return *this;
  }
 
  // 후치 증가 연산자
  Numeric_Iterator operator++(int)
  {
    // 값이 마지막에서 하나 더 뒤라면 이 값은 끝 반복자다
    if (value == static_cast<T>(range.start + range.count*range.step))
    {
      throw std::logic_error(“Cannot increment an end iterator.”);
    }
    auto temp = *this;
    value += range.step; // 범위 스텝만큼 값을 증가
    return temp; // 증가되기 전의 반복자
  }
 
  // 비교
  bool operator<(const Numeric_Iterator& iter) const { return value < iter.value; }
  bool operator==(const Numeric_Iterator& iter) const { return value == iter.value; }
  bool operator!=(const Numeric_Iterator& iter) const { return value != iter.value; }
  bool operator>(const Numeric_Iterator& iter) const { return value > iter.value; }
  bool operator<=(const Numeric_Iterator& iter) const { *this < iter || *this == iter;}
  bool operator>=(const Numeric_Iterator& iter) const { *this > iter || *this == iter;}
};
 

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.