2009-06-03 11 views
20

Chcę użyć okrągłej listy.Czy istnieje standardowa implementacja listy cyrkowej dla C++?

Krótko o wdrożeniu własnego (like this person did) Jakie są moje opcje?

W szczególności to, co chcę zrobić, to wykonać iterację na liście obiektów. Kiedy mój iterator dojdzie do końca listy, powinien automatycznie powrócić do początku. (Tak, zdaję sobie sprawę, że może to być niebezpieczne.)

See Vladimir's definition of a circular_iterator: "Parametr circular_iterator nigdy nie będzie równy CircularList :: end(), dlatego zawsze możesz usunąć ten iterator."

Odpowiedz

27

Nie ma standardowej okrągłej listy.

Istnieje jednak circular buffer w funkcji Zwiększ, co może być pomocne.

Jeśli nie potrzebujesz niczego wyjątkowego, możesz rozważyć użycie tylko vector i dostęp do elementów z indeksem. Możesz po prostu mod swój indeks z rozmiarem wektora, aby osiągnąć to samo, co lista okrągła.

+3

Dzięki Naaff! Zmodyfikowanie indeksu wielkością wektora jest tak proste, jestem zawstydzony, że o tym nie myślałem. – Runcible

+0

Jeśli upewnisz się, że rozmiar 'wektora' jest potęgą dwóch, to zamiast kosztownego narzutu operacji modułu użyj zamiast tego operatora bitowego' & ', ponieważ kosztuje on tylko jeden cykl. Działa to tak: '(n mod (2^k)) == (n & (2^k - 1))' np. 'n% 256 == (n & (255))' –

16

Jeśli chcesz coś wygląda jak iterator można toczyć własną rękę, szukając czegoś jak

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

(Inne operacje iteracyjnej lewo jako ćwiczenie dla czytelnika).

Powiązane problemy