boost::iterator适配器
是最好的选择,相信我的话;)
话虽如此,我想指出一些陷阱。我不认为我可以编辑现有的答案,所以请容忍我。
考虑到你的基本迭代器将是一个向量,你需要小心哪些核心接口函数需要实现。如果你希望你的cycle_iterator
成为一个随机访问迭代器,你需要实现以下所有函数:
increment()
decrement()
advance(n)
distance_to(j)
现在,对于一个循环迭代器来说,distance_to(j)
这个概念有点滑稽,其语义可能会带来各种问题。通过将适配后的迭代器的迭代器类别限制为前向或双向,可以避免这种情况。像这样:
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;
}
}
对于双向迭代器,您还需要使用“decrement”:
void decrement()
{
if (this->base_reference() == this->m_itBegin)
{
this->base_reference() = this->m_itEnd;
}
--this->base_reference();
}
免责声明:我没有通过编译器运行此代码,因此可能会出现错误。
operator<
吗?隐藏循环行为有点淘气! - Matthieu M.