2012-01-24 25 views
6

silmek.MULTISET ben kullanarak bir multiset son elemanını silmek çalışıyorum son öğe

Not: C++ multisets içinde son öğenin yanında .end() puan ve son öğeye değil.

Herhangi bir fikrin var mı?

DÜZENLEME:

Bu neden farklı sayıda sağlıyoruz? multiset `m1 ilave bir veri ile

multiset <int>::reverse_iterator it1 = minheap.rbegin(); 
m1=*(++it1); 

multiset <int>::iterator it2 = minheap.end(); 
m2=*(--it2); 
m2 2 'olan` dır 1' ve. Neden aynı değil?
+0

Düzenlemenizle ilgili olarak: '++ it1 'öğesine ihtiyacınız yok,' rbegin 'zaten son öğeye işaret ediyor. –

+0

Oh, haklısın, üzgünüm, benim için geç oluyor: D – Cristy

cevap

14

Silme işlevi, argüman olarak düzenli bir yineleyici almalıdır. Böyle bir yineleyici almak için, daha sonra yeni C++ 11 önceki işlevini kullanarak bir adım yedekler,

minheap.erase(std::prev(minheap.end())); 

Bu amaçla bir yineleyici almak için ucu() çağrıları çağırarak deneyebilirsiniz. C++ 11 desteği yoksa bir min-yığın olarak Multimap kullanmaya çalışıyorsanız gibi görünüyor, çünkü alternatif olarak priority_queue kullanarak yerine kabul var, Alternatif

minheap.erase(--minheap.end()); 

yazabilir veya push_heap ve pop_heap gibi yığın algoritmaları?

DÜZENLEME: En takip soruya cevap vermek için, buraya iki farklı değerlere alıyoruz nedeni, Multimap'de son unsuru, önce değil bir adım bu mantıksal olarak rbegin puan bitiş noktaları ise Sonunda bir son. Sonunu bir adımda yedeklemek, rbegin ile aynı öğeye başvurur, bu nedenle bir adım ileriye doğru ilerlerseniz, son öğeden bir adım önce öğeye işaret eder.

Bu yardımcı olur umarız!

+0

Modern insanlar 'std :: prev (minheap.end())' yazabilirler, sanırım ... –

+0

@ KerrekSB- Whoa! Bu gerçekten havalı! C++ 11'deki değişikliklerden okumaya başladım. :-) – templatetypedef

+0

Güncellemeye bakın lütfen: D. Ayrıca, "--minheap.end()" de minheap.end() 'da kaydedilen değeri mi değiştiriyor (azaltılıyor)? – Cristy

İlgili konular