2011-12-13 19 views
20

के अंतिम सदस्य मिटाएं मैं एक सेट से अंतिम सदस्य को कैसे हटा सकता हूं?std :: set

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

मैं setInt से 4 कैसे हटा सकते हैं:

उदाहरण के लिए

? मैंने कुछ ऐसा करने की कोशिश की:

setInt.erase(setInt.rbegin()); 

लेकिन मुझे एक त्रुटि मिली।

+0

दोह ठीक है मैं भूल गया था कि सेट में यादृच्छिक पहुंच इटेटरेटर नहीं है। 'SetInt.erase (std :: prev (setInt.end()) का उपयोग करें);' – AJG85

उत्तर

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

वैसे, अगर आप इस एक बहुत (मनमाना क्रम में एक सेट के लिए चीजों को जोड़ने और फिर शीर्ष तत्व को हटाने) कर रहे हैं, तो आप भी एक नज़र std::priority_queue पर ले सकता है, देखते हैं कि क्या उसे अपने उपयोग।

+0

ओह, ओह, मैंने सोचा कि 'अगर' किसी कारण से' लूप 'था ... –

30

C++ 11

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

आप तय कर सकते है कि कैसे आप मामलों को संभालने के लिए जहां सेट खाली है चाहता हूँ।

1

यदि आप अंतिम के बजाय 4 को हटाना चाहते हैं तो आपको खोज विधि का उपयोग करना चाहिए। उपयोग के मामले के आधार पर 4 अंतिम नहीं हो सकता है।

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

आप पिछले तत्व उपयोग को हटाना चाहते हैं:।

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

जबकि मैं अगर यकीन नहीं था - (* अंत); ठीक है। मैंने कुछ पढ़ा तो - rbegin() आधार पर() अंत परिणाम() पर समान परिणाम की ओर जाता है। और दोनों को काम करना चाहिए।

+0

setInt। [Rend() ] (http://www.cplusplus.com/reference/stl/set/rend/) एक iterator देता है जो setInt.begin() से पहले इंगित करता है, इसलिए सेट के अंत में इसका कोई लेना-देना नहीं है। – wigy

+0

आप लिखने के इरादे से सही राबेन हैं। :-(मैं इस – Totonga

+1

को ठीक करता हूं, आपका प्रस्ताव प्रश्न में से एक से अलग कैसे है, जैसा कि हम पहले से ही जानते हैं कि काम नहीं करता है? – bitmask

0

जांचें कि सेट खाली है या नहीं। यदि नहीं, तो अंतिम तत्व प्राप्त करें और इसे इटरेटर के रूप में सेट करें और उस इटरेटर को कम करें और अंतिम तत्व मिटा दें।

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

मैं rbegin जो एक उचित प्रकार है के लिए एक अलग नाम का उपयोग कर का प्रस्ताव चाहते हैं:

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

मान लिया जाये कि आप जाँच की है कि setInt खाली नहीं है!

बीटीडब्ल्यू। यह काम करता है क्योंकि आप अस्थायी कमीशन ऑपरेटर को अस्थायी (std::set<int>::iterator टाइप करें) पर कॉल कर सकते हैं। यह अस्थायी तब मिटाने के समारोह में पारित किया जाएगा।

+0

चालाक, क्योंकि 'std :: vector :: iterator' के विपरीत, कोई तरीका नहीं है कि 'std :: set :: iterator' एक सूचक हो सकता है। यह एक वर्ग प्रकार होना चाहिए, इसलिए अस्थायी को कम करने योग्य होना चाहिए। –

+0

@ स्टेवेजसेप: वे हैं :) – bitmask

संबंधित मुद्दे