Ele poderia ser O (1) se a lista seria armazenar uma bandeira que permite trocar o significado dos “ prev
” e “ next
” ponteiros Cada nó tem. Se a reversão da lista for uma operação frequente, essa adição pode ser realmente útil e não conheço nenhum motivo para implementá-la seria proibida pelo padrão atual. No entanto, ter essa bandeira tornaria a travessia comum da lista mais cara (mesmo que apenas por um fator constante), porque em vez de
current = current->next;
no operator++
iterador da lista, você obteria
if (reversed)
current = current->prev;
else
current = current->next;
o que não é algo que você decida adicionar facilmente. Dado que as listas geralmente são percorridas com muito mais frequência do que são revertidas, seria muito imprudente o padrão exigir essa técnica. Portanto, a operação reversa pode ter complexidade linear. Observe, no entanto, que t ∈ O (1) ⇒ t ∈ O ( n ), portanto, como mencionado anteriormente, implementar tecnicamente sua “otimização” seria permitido.
Se você tem um plano de fundo Java ou similar, pode se perguntar por que o iterador deve verificar o sinalizador a cada vez. Em vez disso, não poderíamos ter dois tipos de iteradores distintos, ambos derivados de um tipo de base comum std::list::begin
e std::list::rbegin
devolver e polimorficamente o iterador apropriado? Embora possível, isso tornaria tudo ainda pior, porque o avanço do iterador seria uma chamada de função indireta (difícil de incorporar) agora. Em Java, você está pagando esse preço rotineiramente de qualquer maneira, mas, novamente, esse é um dos motivos pelos quais muitas pessoas acessam o C ++ quando o desempenho é crítico.
Como apontado por Benjamin Lindley nos comentários, desdereverse
não é permitido invalidar iteradores, a única abordagem permitida pelo padrão parece ser armazenar um ponteiro de volta à lista dentro do iterador, o que causa um acesso à memória indireto duplo.