Bu olabilir olmak O liste “anlamını değiştirmeyi sağlayan bir bayrak saklamak olsaydı (1) prev
” ve “ next
her düğüm vardır” işaretçiler. Listeyi tersine çevirmek sık sık yapılan bir işlemse, bu tür bir ekleme aslında yararlı olabilir ve bu listenin uygulanmasının mevcut standart tarafından yasaklanmasının herhangi bir nedeni bilmiyorum . Bununla birlikte, böyle bir bayrağa sahip olmak listenin sıradan geçişini daha pahalı hale getirecektir (yalnızca sabit bir faktörle), çünkü
current = current->next;
içinde operator++
liste yineleyici, sana ulaşabilir
if (reversed)
current = current->prev;
else
current = current->next;
bu da kolayca eklemeye karar vereceğiniz bir şey değil. Listelerin genellikle ters çevrildiklerinden çok daha sık geçtiği göz önüne alındığında, standardın bu tekniği zorunlu kılması çok mantıklı olmaz . Bu nedenle, ters işlemin doğrusal karmaşıklığa sahip olmasına izin verilir. Bununla birlikte, daha önce de belirtildiği gibi, “optimizasyon” unuzu teknik olarak uygulamanıza izin verilecek şekilde t ∈ O (1) ⇒ t ∈ O ( n ) olduğunu unutmayın.
Bir Java veya benzer bir arka plandan geliyorsanız, yineleyicinin her defasında bayrağı neden kontrol etmesi gerektiğini merak edebilirsiniz. Bunun yerine, her ikisi de ortak bir taban türünden türetilen ve ayrı ayrı uygun yineleyiciye sahip olan std::list::begin
ve std::list::rbegin
polimorfik olarak geri dönen iki ayrı yineleyici türümüz olamaz mı? Mümkün olsa da, bu her şeyi daha da kötüleştirecektir, çünkü yineleyiciyi ilerletmek şimdi dolaylı (inline etmek zor) bir işlev çağrısı olacaktır. Java'da zaten bu fiyatı rutin olarak ödüyorsunuz, ancak daha sonra, performans kritik olduğunda birçok insanın C ++ için ulaşmasının nedenlerinden biri budur.
Tarafından işaret edildiği gibi , Benjamin Lindley beri, yorumlardaki reverse
invalidate yineleyiciler izin verilmez, sadece bir yaklaşım standardına izin verdiği çift dolaylı bellek erişimine neden Yineleyici içindeki listesine bir işaretçi geri saklamak için gibi görünüyor.