2012-04-27 13 views
14

का पहला तत्व कैसे प्राप्त करें Istd :: set

मुझे अपने सॉफ़्टवेयर में एक अजीब बग मिला।

थोड़ी देर के पाश जहां मैं एक एसटीडी से तत्वों को दूर :: सेट, मैं हमेशा चाहता हूँ पहला तत्व लेने के लिए जब तक कंटेनर खाली है अंदर

:

std::set< int*> nodes; 
// Fill nodes 
for (int i=0; i<10;i++) 
    nodes.insert(new int); 
// 
while (!nodes.empty()) 
{ 
int* pivot = (*nodes.begin()); 
// do some operation with pivot erasing some elements from nodes 
} 

मैंने पाया कि पहला तत्व को लागू इस तरह से काम करता है जीसीसी के साथ लेकिन एमएसवीसी के साथ नहीं, यह दुर्घटनाग्रस्त हो जाता है जहां मैं (*nodes.begin()) इटरेटर को कम करने की कोशिश करता हूं।

क्या std :: set के दो कार्यान्वयन अलग-अलग व्यवहार करते हैं?

मैं डेटा संरचना को कार्यान्वित करने के अंतर के साथ रखना चाहता हूं, क्या यह संभव है?

शायद मैं डेटा संरचना के संचालन के इस प्रकार के लिए

+0

अपने भिन्नता के बाद क्या होता एक अपने-बार दोहराना सेट से नहीं हटा सकते है? – Nick

+5

"नोड्स से कुछ तत्वों को मिटाने वाले पिवट के साथ कुछ ऑपरेशन करें" –

+4

इस तरह की अव्यवस्था * (nodes.begin()) – v01d

उत्तर

2

अपने कोड काम अच्छी तरह से VS2010 में परिवर्तन करना होगा, mybe आप अपने VCC अद्यतन करना चाहिए।

-3

आप इस तरह के सेट पर एक इटरेटर का उपयोग नहीं कर सकते हैं क्योंकि सेट से तत्व को हटाने से इटरेटर को अमान्य कर दिया जाता है। जब सेट का आकार एक निश्चित थ्रेसहोल्ड से नीचे हो जाता है (प्रारंभिक आकार के आधार पर जब आप इसे इटरेटर सेट करते हैं) तो यह आपके डेटा के ढेर पर अंतर्निहित स्टोरेज को संशोधित करेगा, जो आपके इटरेटर को बकवास करने के लिए इंगित करने वाले सूचक को छोड़ देगा।

इटरेटर वैधता के तहत देखें: http://www.cplusplus.com/reference/set/set/erase/

(* nodes.begin()) आप क्या चाहते हैं, तो आप सिर्फ माध्यम