2011-12-13 20 views
20

Son üyeyi bir setten nasıl silebilirim?std :: set'in son üyesini sil

set<int> setInt; 
setInt.insert(1); 
setInt.insert(4); 
setInt.insert(3); 
setInt.insert(2); 

nasıl setInt den 4 silebilirsiniz: Örneğin

? Ben böyle bir şey denedim:

setInt.erase(setInt.rbegin()); 

ama bir hata aldı. Bu çok (keyfi sırayla bir dizi şeyler ekleyip ardından üst öğenin kaldırılması) yapıyorsan arada

+0

Doh haklısınız setin rasgele erişim iteratörünün olmadığını unuttuğum. 'SetInt.erase (std :: prev (setInt.end()));' – AJG85

cevap

17
if (!setInt.empty()) { 
    std::set<int>::iterator it = setInt.end(); 
    --it; 
    setInt.erase(it); 
} 

, ayrıca, std::priority_queue bakmak olduğunu uyan olmadığını görebiliyordu senin kullanımı. C

+0

Oh, whoops, 'eğer' bir sebepten dolayı '' '' ''' diye düşündüm… –

30

Sen kümesi boş olduğu davalarını istiyorum nasıl karar verebilir

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

11 ++.

1

4 yerine son silmek isterseniz, bulma yöntemini kullanmalısınız. Kullanım durumuna bağlı olarak 4 sonuncu olmayabilir.

std::set<int>::iterator it = setInt.find(4); 
if(it != setInt.end()) { 
    setInt.erase(it); 
} 

son eleman kullanımını silmek istiyorsanız:. Ben emin değildi iken

if (!setInt.empty()) { 
    setInt.erase(--setInt.rbegin().base()); 
    // line above is equal to 
    // setInt.erase(--setInt.end()); 
} 

- * ucunu(); tamam. Biraz okuma yaptım. Yani - açık rbegin(). Tabanı(), - on (-) ucuyla aynı sonuca yol açar. Ve her ikisi de çalışmalıdır.

+0

setInt. [Rend() ] (http://www.cplusplus.com/reference/stl/set/rend/) setInt.begin() öğesinden önce işaret eden bir yineleyiciyi döndürür, bu nedenle kümenin sonuyla ilgisi yoktur. – wigy

+0

haklısın, ben rbegin yazmayı planladım. :-(Bunu düzeltdim – Totonga

+1

Teklifiniz, sorduğumuz sorudan farklı, nasıl çalıştığını bildiğimiz gibi değil mi? – bitmask

0

Kümenin boş olup olmadığını kontrol edin. Değilse, son öğeyi alın ve yineleyici olarak ayarlayın ve yineleyiciyi azaltın ve son öğeyi silin.

if (!setInt.empty()) 
{ 
    std::set<int>::iterator it = setInt.end(); 
    --it; 
    if(it != setInt.end()) { 
    setInt.erase(it); 
    } 
} 
doğru dürüst bir türü olan rbegin için farklı bir ad kullanarak önermek istiyorum
5

:

setInt.erase(--setInt.end()); 

Eğer setInt boş olmadığını kontrol varsayarsak!

B

Btw. Bu, geçici olarak (std::set<int>::iterator tipi) mutasyona uğramış azaltma işlecini çağırabileceğiniz için çalışır. Bu geçici, daha sonra silme işlevine geçirilecektir.

+0

Cunning okumalıyım çünkü std :: vector :: iterator'den farklı olarak, std :: set :: iterator' işaretçisini kullanmanın bir yolu yoktur. Bir sınıf tipi olmalı, bu yüzden geçici konumlar azaltılabilir olmalıdır. –

+0

@SteveJessop: Onlar :) – bitmask