假设我想编写一个双向迭代器,它迭代任何提供begin()
/ end()
/ rbegin()
/的容器的所有非零值rend()
。我将不得不重写operator++()
以跳过它遇到的所有零。为了确保它仍然有效,它必须每次都检查end()
容器rend()
。以下内容:
template<class Container, class Iter>
struct NonZeroIter: public Iter
{
Container& c;
using Parent = Iter;
using Parent::Parent;
using iterator_category = std::bidirectional_iterator_tag;
bool is_valid() const { return *(*this) != 0; }
bool is_end() const { return *this == c.end(); }
bool is_rend() const { return *this == c.rend(); }
NonZeroIter(Container& _c, const Iter& _it):
Parent(_it),
c(_c)
{ if(!is_end() && !is_valid()) ++(*this); }
NonZeroIter& operator++()
{
if(!is_end()){
do{
Parent::operator++();
} while(!is_end() && !is_valid());
}
return *this;
}
NonZeroIter& operator--()
{
if(!is_rend()){
do{
Parent::operator--();
} while(!is_rend() && !is_valid());
}
return *this;
}
NonZeroIter& operator++(int) { NonZeroIter tmp(*this); ++(*this); return tmp; }
NonZeroIter& operator--(int) { NonZeroIter tmp(*this); --(*this); return tmp; }
};
现在,我想做一个使用的反向迭代器,NonZeroIter
但std::reverse_iterator
要做到这一点,我必须在每次检查rend()
时NonZeroIter
检查end()
,反之亦然。有没有一种很好的方法(如果可能的话避免开销),还是我必须编写自己的相应反向迭代器类?