Es könnte sein , O (1) , wenn die Liste ein Flag speichern würde , die die Bedeutung der „ermöglicht Swapping prev
“ und „ next
“ Zeiger jeder Knoten. Wenn das Umkehren der Liste eine häufige Operation wäre, könnte eine solche Hinzufügung tatsächlich nützlich sein, und ich kenne keinen Grund, warum die Implementierung nach dem aktuellen Standard verboten wäre . Ein solches Flag würde jedoch das gewöhnliche Durchlaufen der Liste verteuern (wenn auch nur um einen konstanten Faktor), weil statt
current = current->next;
im der operator++
Liste Iterator würden Sie bekommen
if (reversed)
current = current->prev;
else
current = current->next;
Das ist nicht etwas, das Sie einfach hinzufügen möchten. Angesichts der Tatsache, dass Listen normalerweise viel häufiger durchlaufen werden als umgekehrt, wäre es für den Standard sehr unklug, dies zu tun beauftragen , diese Technik. Daher darf die umgekehrte Operation eine lineare Komplexität aufweisen. Beachten Sie jedoch, dass t ∈ O (1) ⇒ t ∈ O ( n ) ist, sodass, wie bereits erwähnt, die technische Implementierung Ihrer „Optimierung“ zulässig ist.
Wenn Sie aus Java oder einem ähnlichen Hintergrund stammen, fragen Sie sich möglicherweise, warum der Iterator das Flag jedes Mal überprüfen muss. Könnten wir nicht stattdessen zwei unterschiedliche Iteratortypen haben, die beide von einem gemeinsamen Basistyp abgeleitet sind std::list::begin
und std::list::rbegin
den entsprechenden Iterator haben und polymorph zurückgeben? Während dies möglich wäre, würde dies das Ganze noch schlimmer machen, da das Vorrücken des Iterators jetzt ein indirekter (schwer zu inline) Funktionsaufruf wäre. In Java zahlen Sie diesen Preis ohnehin routinemäßig, aber dies ist einer der Gründe, warum viele Menschen nach C ++ greifen, wenn die Leistung kritisch ist.
Wie Benjamin Lindley in den Kommentaren reverse
hervorhob, scheint der einzige Ansatz, der vom Standard zugelassen wird, darin zu bestehen, einen Zeiger zurück auf die Liste im Iterator zu speichern, was einen doppelt indirekten Speicherzugriff verursacht.