Ini bisa menjadi O (1) jika daftar akan menyimpan flag yang memungkinkan bertukar makna pointer " prev
" dan " next
" yang dimiliki masing-masing node. Jika membalik daftar akan menjadi operasi yang sering, penambahan semacam itu mungkin sebenarnya berguna dan saya tidak tahu alasan mengapa menerapkannya akan dilarang oleh standar saat ini. Namun, memiliki bendera seperti itu akan membuat traversal biasa dari daftar lebih mahal (jika hanya dengan faktor konstan) karena alih-alih
current = current->next;
di operator++
daftar iterator, Anda akan dapatkan
if (reversed)
current = current->prev;
else
current = current->next;
yang bukan sesuatu yang akan Anda putuskan untuk ditambahkan dengan mudah. Mengingat bahwa daftar biasanya dilalui jauh lebih sering daripada terbalik, akan sangat tidak bijaksana jika standar mengamanatkan teknik ini. Oleh karena itu, operasi sebaliknya diizinkan untuk memiliki kompleksitas linier. Namun, perhatikan bahwa t ∈ O (1) ⇒ t ∈ O ( n ) jadi, seperti yang disebutkan sebelumnya, menerapkan "optimisasi" Anda secara teknis akan diizinkan.
Jika Anda berasal dari Jawa atau latar belakang serupa, Anda mungkin bertanya-tanya mengapa iterator harus memeriksa bendera setiap kali. Tidak bisakah sebaliknya kita memiliki dua jenis iterator yang berbeda, keduanya berasal dari tipe basis yang sama, dan memiliki std::list::begin
dan secara std::list::rbegin
polimorfik mengembalikan iterator yang sesuai? Meskipun mungkin, ini akan membuat semuanya menjadi lebih buruk karena memajukan iterator akan menjadi panggilan fungsi tidak langsung (sulit untuk inline) sekarang. Di Jawa, Anda membayar harga ini secara rutin, tetapi sekali lagi, ini adalah salah satu alasan banyak orang meraih C ++ ketika kinerja sangat penting.
Seperti yang ditunjukkan oleh Benjamin Lindley dalam komentar, karena reverse
tidak diperbolehkan untuk membatalkan iterator, satu-satunya pendekatan yang diizinkan oleh standar tampaknya menyimpan pointer kembali ke daftar di dalam iterator yang menyebabkan akses memori tidak langsung ganda.