Pregunta

Quiero usar una lista circular.

A falta de implementación de la mía ( como esta persona hizo ) ¿cuáles son mis opciones?

En concreto lo que quiero hacer es iterar sobre una lista de objetos. Cuando mi iterador llega al final de la lista, se debe volver automáticamente al principio. (Sí, me doy cuenta de que esto podría ser peligroso.)

véase la definición de un circular_iterator de Vladimir: "Un circular_iterator nunca será igual a CircularList :: end (), por lo que siempre se puede eliminar la referencia de este iterador. "

¿Fue útil?

Solución

No hay ninguna lista circular estándar.

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

Si usted no necesita 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 de lograr lo mismo como una lista circular.

Otros consejos

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).

list<int>::iterator circularNext(list<int> &l, list<int>::iterator &it)
{
    return std::next(it) == l.end() ? l.begin() : std::next(it);
}

Además de @ capitán violación de segmento y respuestas centrado iterador-de-khaled @ Mahmoud, también se puede utilizar std::list como una lista circular mediante la alteración de lo que se hace para recuperar elementos de la misma. Utilice de empalme para mover un extremo de la lista al otro extremo como que lo procesa.

template <typename T>
T & circularFront(std::list<T> & l)
{
  l.splice(l.end(), l, l.begin());
  return l.back();
}
template <typename T>
T & circularBack(std::list<T> & l)
{
  l.splice(l.begin(), l, l.rbegin());
  return l.front();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top