2016-01-25 20 views
7

Sadece aşağıdaki kodu yazılı ve derleme değil çok şaşırdım ettik: Gördüğünüz gibi, eğer varsaNiçin destek geri yineleyicileri silmez?

std::deque<int> container; 
// filling the container... 
for (auto it = container.rbegin(); it != container.rend(); ++it) 
    if (*it == 5) 
    { 
     container.erase(it); 
     break; 
    } 

, ben, belli kriterleri son öğe silmek istiyorum.

hata İlk başta

std :: deque :: silme (STD :: reverse_iterator çağrısına için eşleşen işlevi ...

olduğunu içindi galiba etmedi . ters iterasyon neden, ama bu gerçekten bunu çözer begin/end ile rbegin/rend değiştirilmesi beri böyledir

Yani, 2 soru:

  1. Bu neden desteklenmiyor? C++ komitesinin standartlara dahil etmeyi unutduğu küçük şeylerden mi yoksa bu aşırı yüklenmede eksiklik mi var?
  2. İstediğimi yapmanın en zarif yolu nedir? İndeks ile yinelenen takılı mıyım?
+4

için de geçerli olduğunu görmek kolaydır. Cevabınızın burada olduğunu düşünüyorum: http://stackoverflow.com/questions/1830158/how-to-call-erase-with-a-reverse- yineleyici –

+0

'm_container' ve 'container ', aynı mı? – ZDF

+0

@ZDF: evet, tabii ki, sabit. –

cevap

1

'Neden' sorusu üzerine cevap veremez, ancak cevap 'nasıl' - Eğer yineleyici üzerinde base() çağırmalıdır. Doğru bir ileri yineleyici döndürecek.

Bunu yaparken, ters ve ileri yineleyiciler arasındaki ilişkiyi akılda tutun. İlk başta kafa karıştırıcı olabilir, ama aslında oldukça basit. Eğer aşağıdaki öğelerden içeren bir std::vector varsa:

1, 2, 3, 4, 5 

Ve çözümleyecek üzerine size 3'ü verir bir reverse_iterator rit, var, sonra *(rit.base) sadece normal yineleyiciler begin() yılında unutmayın, nedenini öğrenmek için 4'e eşit olacaktır kabul edilemez, ancak end() değildir. Ters yineleyicilerde, özellik aynı olmalıdır - rbegin() dereferencible olmalıdır, ancak rend(), yani kabın başlangıcını işaret etmemelidir. rend reverse_iterator(begin()), tüm yukarıda tutabilir tek yolu olarak inşa edilebilir çünkü rend.base() başından ötesinde birine yanındaki sağ eleman dönecektir eğer tanım gereği bu yana

, rend.base()begin() aynıdır (vardır - begin() Aynı simetrinin rend()

+0

Yanıtı reddettiniz çünkü 'reverse_iterator :: base()' işlevini sadece ase' yöntemi. –

+0

@VioletGiraffe, neden? – SergeyA

+0

Yanlış unsuru sileceği için! Yineleyici önce 1 ile ayarlanmalıdır. –