boost::iterator adaptor
是要走的路,相信我的话;)
话虽如此,我想指出一些陷阱。我认为我无法编辑现有答案,所以请耐心等待。
鉴于您的基本迭代器将是一个向量,您需要小心您需要实现哪些核心接口函数。如果您希望自己cycle_iterator
成为随机访问迭代器,则需要以下所有内容:
increment()
decrement()
advance(n)
distance_to(j)
现在distance_to(j)
对于 a 来说是一个有点有趣的概念cycle_iterator
,它的语义会给你带来各种麻烦。这可以通过将适配迭代器的迭代器类别限制为正向或双向来避免。像这样:
template <class BaseIterator>
class cycle_iterator
: public boost::iterator_adaptor<
cycle_iterator // Derived
, BaseIterator // Base
, boost::use_default // Value
, boost::forward_traversal_tag // CategoryOrTraversal
>
{ ... };
在这种情况下,您只需要实现增量:
void increment()
{
if (++this->base_reference() == this->m_itEnd)
{
this->base_reference() = this->m_itBegin;
}
}
对于双向,您还需要递减:
void decrement()
{
if (this->base_reference() == this->m_itBegin)
{
this->base_reference() = this->m_itEnd;
}
--this->base_reference();
}
免责声明:我没有通过编译器运行它,所以我准备好尴尬了。