26

循環リストを使いたい。

私自身の実装を除いて (この人がしたように) 私のオプションは何ですか?

具体的に私がやりたいことは、オブジェクトのリストを反復処理することです。イテレータがリストの最後に到達すると、自動的に最初に戻るはずです。(はい、これが危険な場合があることは理解しています。)

Vladimir の a の定義を参照しcircular_iteratorてください。

4

5 に答える 5

32

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

ただし、Boost には循環バッファーがあり、役立つ場合があります。

派手なものが必要ない場合は、 a を使用しvectorて、インデックスを使用して要素にアクセスすることを検討してください。mod循環リストとほぼ同じことを達成するために、ベクトルのサイズを使用してインデックスを作成できます。

于 2009-06-03T22:09:47.023 に答える
21

イテレータのように見えるものが必要な場合は、次のように独自にロールできます

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;}}
};

(他のイテレータ操作は読者への演習として残されています)。

于 2009-06-03T23:05:11.653 に答える