boost::iterator adaptor
を見に行くための方法です取る、それは私の言葉を取る;)
私はいくつかの落とし穴を指摘したい言われていること。私は既存の答えを編集することはできないと思うので、私に同行してください。
基本反復子がベクトルになるとすれば、実装する必要があるコアインタフェース関数に注意する必要があります。
increment()
decrement()
advance(n)
distance_to(j)
今すぐdistance_to(j)
がcycle_iterator
のため多少面白いコンセプトであり、その意味は、トラブルのすべての種類であなたを得ることができます:あなたはあなたのcycle_iterator
は、ランダムアクセスイテレータになりたい場合は、以下のすべてを必要とします。これは、適合イテレータのイテレータカテゴリを順方向または双方向に制限することによって回避できます。
void decrement()
{
if (this->base_reference() == this->m_itBegin)
{
this->base_reference() = this->m_itEnd;
}
--this->base_reference();
}
は免責事項:私はを介してこれを実行しなかったあなたも減少を必要とする双方向について
void increment()
{
if (++this->base_reference() == this->m_itEnd)
{
this->base_reference() = this->m_itBegin;
}
}
:あなただけの増分を実装する必要がある。この場合
template <class BaseIterator>
class cycle_iterator
: public boost::iterator_adaptor<
cycle_iterator // Derived
, BaseIterator // Base
, boost::use_default // Value
, boost::forward_traversal_tag // CategoryOrTraversal
>
{ ... };
:このようにコンパイラなので、私は恥ずかしい準備ができています。
私はそのようなイテレータを書いていますので、間違いなく可能です=) 唯一の覚えがあるのは、比較演算子<はイテレータが等しい場合を除いて常に真を返すことです。 –
一方、本当に 'operator <'が必要ですか?サイクリックビヘイビアを隠すのはちょっといたずらです! –