我有一个基于模板的自定义集合(因为我们不能在界面上使用std :: vector)。我想实现一个特定于此集合的reverse_iterator。下面的反向迭代器结构是嵌套在集合类中的结构。迭代器(基本上是指向集合元素类型的指针)已经实现。这是我第一次尝试反向迭代器。
template <typename T>
struct reverse_iterator
{
typedef T::iterator iterator;
typedef T& reference;
inline reverse_iterator(const iterator & it):_it(it){}
inline reverse_iterator() : _it(0x0) {}
inline iterator base() const {iterator it = _it; return --it;}
inline reverse_iterator operator ++ () {return reverse_iterator(--_it);}
inline reverse_iterator operator -- () {return reverse_iterator(++_it);}
inline reverse_iterator operator ++ (int val) {_it -= val; return reverse_iterator(_it);}
inline reverse_iterator operator -- (int val) {_it += val; return reverse_iterator(_it);}
inline reverse_iterator operator += (int val) {_it -= val; return reverse_iterator(_it);}
inline reverse_iterator operator -= (int val) {_it += val; return reverse_iterator(_it);}
inline reverse_iterator operator + (int val) const {iterator it = _it - val; return reverse_iterator(it);}
inline reverse_iterator operator - (int val) const {iterator it = _it + val; return reverse_iterator(it);}
bool operator == (const iterator & other) const {return other == base();}
bool operator != (const iterator & other) const {return other != base();}
reference operator*() const {return *base();}
iterator operator->() const {return base();}
private:
iterator _it;
};
答案 0 :(得分:2)
除了下面提到的内容之外,您的实现几乎与libstdc ++(v3中的实现相同,但仍然有些准确)。请注意,您目前缺少所有非成员函数。总而言之,您应该尝试匹配std::reverse_iterator
界面:如果您能够使用标准类型,则可以通过mylab::reverse_iterator
愉快地交换std::reverse_iterator
。
reverse_iterator
之间的所有比较运算符,例如operator==
,operator!=
,operator<
等等。这基本上是您reverse_iterator
与标准版不同的内容列表。
通常,pre-increment / -decrement运算符返回引用(*this
)而不是新对象。
后递增/递减运算符不应该取值:
inline reverse_iterator operator ++ (int) {
reverse_iterator tmp = *this;
++*this; // implement post-increment in terms of pre-increment!
// or --_it;
return tmp;
}
inline reverse_iterator operator -- (int) { ... }
复合赋值运算符通常也会返回引用。
const iterator&
构造函数应为explicit
,否则可能会意外混合反向和正常迭代器。您应该使用底层迭代器作为模板参数,而不是容器类型T
:
template <typename Iterator>
struct reverse_iterator
{
typedef Iterator iterator;
typedef typename iterator_traits<Iterator>::reference reference;
...
}
这使您可以对reverse_iterator
可以处理的任何内容使用iterator_traits
:
template <class Iterator>
struct iterator_traits{
typedef typename Iterator::reference reference;
// Add other things
};
template <class T>
struct iterator_traits<T*>{
typedef T & reference;
};
有了这个,你甚至可以使用reverse_iterator<int *>
或类似的。
operator->
通常返回指向底层对象的指针,而不是中间迭代器。您可能希望为您的特征和原始迭代器添加pointer
typedef。
operator==(const iterator&)
。