这是我必须为学校解决的练习,所以请不要给我任何完整的解决方案,只是提示; - )
练习如下:
首先我想继承向量容器的迭代器,然后我得到了这个(只是我的“解决方案”的一部分,但我意识到这很糟糕并停止了......):
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”指定),但这不应该是一个问题。
答案 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++
等)中,您将--
与p
和s
核对,以确保其保持在e
内界限。
答案 1 :(得分:2)
我认为只存储三个迭代器(begin
,end
和current
)并实现所需的方法,而不是从包装的迭代器类型继承。对于你的特定迭代器,它执行绑定检查(递增,递减),并且只委托包装的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*();
// ...
};