带有范围检查的自制迭代器

时间:2013-12-27 23:12:35

标签: c++ inheritance iterator

这是我必须为学校解决的练习,所以请不要给我任何完整的解决方案,只是提示; - )

练习如下:

  • 实现一个封装另一个迭代器(即序列)并执行范围检查的迭代器
  • 使用序列的第一个和最后一个元素
  • 初始化迭代器
  • 如果迭代器指向第一个元素并且减少了或者如果迭代器指向最后一个元素并且增加了信号错误 - 选择一个适当的信号表示错误

首先我想继承向量容器的迭代器,然后我得到了这个(只是我的“解决方案”的一部分,但我意识到这很糟糕并停止了......):

template <typename T>
class myIter : std::vector<T>::iterator
{
public:
    myIter( typename std::vector<T>::iterator start,
        typename std::vector<T>::iterator end,
        typename std::vector<T>::iterator pos,
        bool behaviour=false) : s(start), e(end), p(pos), beh(behaviour)
        {overflowFlag = false;};
    typename std::vector<T>::iterator & operator++();
    typename std::vector<T>::iterator & operator--();
    typename std::vector<T>::iterator operator++(int);
    typename std::vector<T>::iterator operator--(int);
    typename std::vector<T>::iterator & operator+=(int);
    typename std::vector<T>::iterator & operator-=(int);
    typename std::vector<T>::iterator operator+(int);
    typename std::vector<T>::iterator operator-(int);
    myIter & operator=(const myIter&) = delete;
    T operator*(){ return *p;};
    bool getFlag() {return overflowFlag;};
private:
    typename std::vector<T>::iterator s, e, p;
    bool beh;
    bool overflowFlag; // is set if beh = false. otherwise exception;
};

所以我意识到我并没有真正从vector迭代器继承(我这样做,但我没有使用它)。使用标准迭代器功能的最简单方法是什么,但是在“顶部”执行范围检查?如果违反了范围,我可以抛出一个异常,或者设置一个“errorflag”(由boolean“beh”指定),但这不应该是一个问题。

2 个答案:

答案 0 :(得分:2)

目标是在任意迭代器类型之上添加行为。您正在编写的类将是通用的,但会将其实际的“iterator-ness”大部分推迟到其模板参数:让我们将I称为“iterator”。

无论您何时使用std::vector<T>::iterator,请使用普通I。 (当您对代码进行推理时,可能有助于在心理上将I替换为具体类型。例如,当迭代char[]数组时,I将为{{1} }}。)

你班级的基本骨架如下:

char*

在各种变更器(template <typename I> class myIter { public: myIter(I start, I end, I pos); private: I s, e, p; }; operator++等)中,您将--ps核对,以确保其保持在e内界限。

答案 1 :(得分:2)

我认为只存储三个迭代器(beginendcurrent)并实现所需的方法,而不是从包装的迭代器类型继承。对于你的特定迭代器,它执行绑定检查(递增,递减),并且只委托包装的current迭代器。

正如您所见,您并不真正使用容器类型,也不使用迭代器,因此您甚至可以将迭代器类型传递给模板类。

template < typename T, typename Iter >
class bound_checked_iterator {
 public:
  bound_checked_iterator(Iter begin, Iter end)
  : begin_(begin), end_(end), current_(begin) {}

  // implements the different methods
  bound_checked_iterator operator++();
  bound_checked_iterator operator--();
  bound_checked_iterator operator++(int);
  bound_checked_iterator operator--(int);

  T& operator *();
  const T& operator *() const;

 bool operator ==(bound_checked_operator const& other) const;
 bool operator !=(bound_checked_operator const& other) const;

 private:
  Iter begin_, end_, current_;
};

您需要为迭代器实现的方法是:

  • 前后增量
  • 减量前后
  • 解除引用运算符
  • 平等和不平等比较

您可以获得完整列表here

在评论中提到的@Jarod42,您甚至不需要将数据类型传递给模板,但您可以使用std::iterator_traits<Iter>来推断它:

template < typename Iter >
class bound_checked_iterator {
 public:
  bound_checked_iterator(Iter begin, Iter end)
  : begin_(begin), end_(end), current_(begin) {}

  // ...
  typename std::iterator_traits<Iter>::reference operator*();

  // ...
};