2009-06-03 13 views
20

Quiero usar una lista circular.¿Existe una implementación estándar de una lista circular para C++?

corto de poner en práctica mi propia (like this person did) ¿cuáles son mis opciones?

Específicamente lo que quiero hacer es iterar sobre una lista de objetos. Cuando mi iterador llegue al final de la lista, debería regresar automáticamente al principio. (Sí, me doy cuenta de que esto podría ser peligroso.)

See Vladimir's definition of a circular_iterator: "Un circular_iterator nunca será igual con CircularList :: end(), por lo tanto, siempre puede desreferencia este iterador."

Respuesta

27

No hay ninguna lista circular estándar.

Sin embargo, hay una circular buffer en Boost, que podrían ser útiles.

Si no es necesario ningún procedimiento especial, se podría considerar el uso de un solo vector y acceder a los elementos con un índice. Puede simplemente mod su índice con el tamaño del vector para lograr casi lo mismo que una lista circular.

+3

Gracias Naaff! Modificar el índice con el tamaño del vector es una solución tan simple, me da vergüenza que no pensé en eso. – Runcible

+0

Si se asegura de que el tamaño de su 'vECTOR' es una potencia de dos, entonces en vez de la sobrecarga caro de la operación de módulo, utilice el bit a bit' 'Y en lugar del operador, ya que sólo cuesta un ciclo. Funciona así: '(n mod (2^k)) == (n & (2^k - 1))' p. Ej. 'n% 256 == (n & (255))' –

16

Si quieres algo que parece un iterador que puede rodar su propia, buscando algo así como

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

(Otras operaciones de iterador dejan como ejercicio para el lector).

Cuestiones relacionadas