¿Existe una implementación estándar de una lista circular para C ++?
-
09-09-2019 - |
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. "
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();
}