2008-10-21 14 views
7

मैं एक सशर्त के रूप में set.insert (key) का उपयोग करने की कोशिश कर रहा हूं, जहां कुंजी सही ढंग से डाली जाती है (जिसका अर्थ है कि कुंजी सेट में पहले से मौजूद नहीं है) तो इसे आगे बढ़ना चाहिए और किसी प्रकार का कोड करना चाहिए। उदाहरण के लिए, कुछ:एक सशर्त के रूप में set.insert (कुंजी) का उपयोग कर?

if (set.insert(key)) { 
    // some kind of code 
} 

क्या यह अनुमति है? क्योंकि संकलक इस त्रुटि फेंक है:

conditional expression of type 'std::_Tree<_Traits>::iterator' is illegal 
+0

मुझे लगता है कि आप झूठ बोल रहे हैं। यह पहले 'लापता' के बारे में शिकायत करेगा। ;-) –

उत्तर

13

है कि एक ही कुंजी मान लेता डालने के संस्करण एक std::pair<iterator,bool> लौटना चाहिए, जहां बूल इंगित करता है कि एक सम्मिलन किया गया था या नहीं। सत्य का एक मूल्य इंगित करता है कि मान डाला गया था, और झूठी इंगित करता है कि मान पहले से मौजूद था। तो अपने सशर्त इस प्रकार दिखाई देगा:

if(set.insert(key).second) { 
     // code 
} 
2

सेट :: डालने एक जोड़ी देता है, इस प्रयास करें:

if(set.insert(key).second) { 
    // some kind of code 
} 
1

अन्य उत्तर बस का उपयोग कर '.second' का सुझाव दिया है, और यह काम करेगा - लेकिन संसाधन है कि आप करने की आवश्यकता सेट में मौजूदा प्रविष्टि, तो का उपयोग करता है, तो आप सम्मिलित करने के पूर्ण परिणाम को स्टोर कर सकते हैं:

std::pair<std::set<key>::iterator, bool> iResult = set.insert (key); 
if (iResult.second) { 
    // some kind of code - insert took place 
} 
else { 
    // some kind of code using iResult.first, which 
    // is an iterator to the previous entry in the set. 
} 
संबंधित मुद्दे