C ++自定义集合reverse_iterator,具有与std :: vector实现类似的行为 [英] C++ custom collection reverse_iterator with similar behaviour to std::vector implementation
问题描述
我有一个基于模板的自定义集合(因为我们不能在界面上使用std :: vector)。我想实现一个特定于此集合的reverse_iterator。下面的反向迭代器结构是嵌套在集合类中的结构。迭代器(基本上是指向集合的元素类型的指针)已经实现。这是我第一次尝试反向迭代器。
I have a template based custom collection (as we cannot use std::vector on the interface). I would like to implement a reverse_iterator specific to this collection. The reverse iterator struct below is a structure nested within the collection class. An iterator (basically a pointer to element type of the collection) is already implemented. This is my first attempt at a 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;
};
- 这是可行的reverse_iterator还是我错过了什么?
- 这可以改进吗?
推荐答案
除了东西您在下面提到的实现与libstdc ++中的实现几乎相同( v3 ,但仍然有点准确)。请注意,您目前缺少所有非成员函数。总而言之,您应该尝试匹配 std :: reverse_iterator
界面:如果您能够使用标准类型,您可以愉快地通过交换
。 mylab :: reverse_iterator
std :: reverse_iterator
Except for the things mentioned below your implementation is almost the same as the implementation in libstdc++ (v3, but still somewhat accurate). Note that you're currently missing all non-member functions. All in all you should try to match the std::reverse_iterator
interface: if you're ever able to use std types you can happily exchange your mylab::reverse_iterator
by std::reverse_iterator
.
- 您缺少
reverse_iterator
之间的所有比较运算符,例如运算符==
,运算符!=
,operator<
等等。
- You're missing all comparison operators between
reverse_iterator
, such asoperator==
,operator!=
,operator<
and so on.
< h2>奇怪的事情
这基本上是你的 reverse_iterator
与标准的不同之处。
Strange things
This is basically a list of stuff where your reverse_iterator
differs from the standard one.
-
通常预增量/ -decrement运算符返回一个引用(
* this
)而不是新对象。
后递增/递减运算符不应该取值:
The post increment/decrement operators shouldn't take a value:
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) { ... }
复合赋值运算符通常也会返回引用。
The compound assignment operators also usually return references.
而不是容器类型 T
你应该使用底层迭代器作为模板参数:
Instead of a container type T
you should use the underlying iterator as template parameter:
template <typename Iterator>
struct reverse_iterator
{
typedef Iterator iterator;
typedef typename iterator_traits<Iterator>::reference reference;
...
}
这使您可以使用 reverse_iterator
关于 iterator_traits
可以处理的任何事情:
This enables you to use reverse_iterator
on anything that iterator_traits
can handle:
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 *>
或类似。
With this you can even use reverse_iterator<int *>
or similar.
operator->
通常返回指向底层对象的指针,而不是中间迭代器。您可能希望为您的特征和原始迭代器添加指针
typedef。
operator->
usually returns a pointer to the underlying object, not an intermediary iterator. You might want to add a pointer
typedef to both your traits and your original iterator.
这篇关于C ++自定义集合reverse_iterator,具有与std :: vector实现类似的行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!