2009-06-03 14 views
20

私は円形のリストを使いたいです。C++のサーキュラーリストの標準実装は存在しますか?

自分のオプション(like this person did)を実装するのに手間がかかりますか?

具体的には、オブジェクトのリストを反復処理します。イテレータがリストの最後に到達すると、自動的に最初に戻ります。

See Vladimir's definition of a circular_iterator: "circular_iteratorは決してCircularList :: end()と等しくないので、いつもこのイテレータを参照解除することができます。"

答えて

27

標準の循環リストはありません。

しかし、役立つかもしれないBoostにcircular bufferがあります。

何も気にする必要がない場合は、vectorを使用し、インデックスを持つ要素にアクセスすることを検討するとよいでしょう。 modあなたのインデックスは、循環型リストと同じことを達成するためにベクトルの大きさで行うことができます。

+3

ありがとうNaaff!ベクトルの大きさでインデックスを修正するのは簡単な解決策ですが、私はそれを考えなかったのは恥ずかしいです。 – Runcible

+0

'vector'の大きさが2の累乗であることを保証するならば、モジュラス演算の高価なオーバーヘッドの代わりに、ビット単位の'& '演算子を使用してください。これは次のように動作します。 '(n mod(2^k))==(n&(2^k-1))' 'n%256 ==(n&(255))' –

16

あなたがあなた自身をロールバックすることができますイテレータのように見える何かをしたい場合は、

template <class baseIter> 
class circularIterator { 
    private: 
     baseIter cur; 
     baseIter begin; 
     baseIter end; 
    public: 
     circularIterator(baseIter b, baseIter e, baseIter c=b) 
      :cur(i), begin(b), end(e) {} 
     baseIter & operator ++(void) {++cur; if(cur == end) {cur = begin;}} 
}; 

のようなものを探して(他のイテレータ操作は読者への課題として残して)。

関連する問題