Pergunta

Eu quero usar uma lista circular.

curta de implementar minha própria ( como essa pessoa fez ) quais são as minhas opções?

Especificamente o que eu quero fazer é iterar sobre uma lista de objetos. Quando meu iterador atinge o final da lista, ele deve retornar automaticamente para o início. (Sim, eu percebo isso pode ser perigoso.)

definição de um circular_iterator See de Vladimir: "A circular_iterator nunca vai ser igual a CircularList :: end (), assim você sempre pode excluir a referência deste iterador. "

Foi útil?

Solução

Não há nenhuma lista circular padrão.

No entanto, há uma circular tampão em Boost, que pode ser útil.

Se você não precisa de nada extravagante, você pode considerar apenas usando um vector e acessar os elementos com um índice. Você pode apenas mod seu índice com o tamanho do vetor para conseguir a mesma coisa como uma lista circular.

Outras dicas

Se você quiser algo parecendo um iterador que você pode lançar seu próprio, procurando algo 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;}}
};

(operações Outros iteradoras deixado como exercício para leitor).

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

Além de @ capitão-segfault e @ respostas iteradoras-focalizado de mahmoud-khaled, você também pode usar std::list como uma lista circular alterando o que você faz para recuperar elementos da mesma. Use emenda para mover uma extremidade da lista para a outra extremidade como você processá-lo.

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top