2009-06-03 7 views
20

Ich möchte eine kreisförmige Liste verwenden.Existiert eine Standardimplementierung einer Circular List für C++?

Kurz meine eigenen (like this person did) zu implementieren, was sind meine Optionen?

Insbesondere was ich tun möchte, ist über eine Liste von Objekten zu iterieren. Wenn mein Iterator das Ende der Liste erreicht, sollte er automatisch zum Anfang zurückkehren. (Ja, mir ist klar, dass dies gefährlich sein könnte.)

See Vladimir's definition of a circular_iterator: "Ein circular_iterator wird nie mit CircularList :: end() gleichgesetzt, so dass Sie diesen Iterator immer dereferenzieren können."

Antwort

27

Es gibt keine Standard-Ringliste.

Allerdings gibt es eine circular buffer in Boost, die hilfreich sein könnte.

Wenn Sie nichts Besonderes brauchen, können Sie nur einen vector verwenden und auf die Elemente mit einem Index zugreifen. Sie können einfach mod Ihren Index mit der Größe des Vektors erreichen, um die gleiche Sache wie eine zirkuläre Liste zu erreichen.

+3

Danke Naaff! Modding der Index mit der Größe des Vektors ist so eine einfache Lösung, ich schäme mich, ich habe nicht daran gedacht. – Runcible

+0

Wenn Sie sicherstellen, dass die Größe Ihres "Vektors" eine Zweierpotenz ist, verwenden Sie anstelle des teuren Overheads der Modulo-Operation stattdessen den bitweisen "&" Operator, da dieser nur einen Zyklus kostet. Es funktioniert so: '(n mod (2^k)) == (n & (2^k - 1)) 'z.B. 'n% 256 == (n & (255))' –

16

Wenn Sie so etwas wie ein Iterator suchen möchten, dass Sie Ihre eigenen rollen kann, etwas suchen, wie

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

(Andere Iterator Operationen als Übung für den Leser links).