2012-03-23 10 views
5

मैं कुछ std::list की सामग्री को साफ़ करना चाहता हूं। तत्वों को हटाने का आदेश मेरे लिए महत्वपूर्ण है। निम्नलिखित परीक्षण कार्यक्रम के आउटपुट के अनुसार, आदेश पहले से अंतिम तत्व तक है। क्या ऐसा होने की गारंटी है? यह सी ++ 2003 मानक से मेरे लिए स्पष्ट नहीं था।std :: सूची से तत्वों को समाशोधन करने का आदेश क्या है?

#include <list> 
#include <iostream> 

struct A 
{ 
    A(int i) : I(i) {} 
    ~A() { std::cout << I << std::endl; } 
    int I; 
}; 

int main() 
{ 
    std::list<A> l; 
    l.push_back(A(1)); 
    l.push_back(A(2)); 
    l.push_back(A(3)); 

    std::cout << "clearing list" << std::endl; 
    l.clear(); 
} 

ideone link

+3

जिज्ञासा से बाहर: हटाने का आदेश आपके लिए महत्वपूर्ण क्यों है? – nietaki

+4

यदि यह आपके लिए महत्वपूर्ण है तो आप दूसरे को मैन्युअल रूप से मिटाने के लिए मिटाएं() का उपयोग कर सकते हैं। –

+4

@ गैब्रियलस्च्रेबर: ... या 'pop_front() '। – kennytm

उत्तर

8

नहीं, यह परिभाषित नहीं कर रहा है, और आप इसे पर भरोसा नहीं करना चाहिए।

3

नहीं, यह परिभाषित नहीं किया गया है।

मानक केवल specifys कि जब भी आप a.clear() फोन यह a.erase(q1,q2) के रूप में समाधान हो जाएगा और यह सिर्फ निर्दिष्ट है मिटा रेंज [q1,q2) में सभी तत्वों को मिटा देगा, लेकिन यह जिस क्रम में वह ऐसा ही करेगा निर्दिष्ट नहीं है।

0

से C++ 03 मानक:

तालिका 67 अनुक्रम आवश्यकताओं (कंटेनर के अलावा) ...

a.clear()

दावे/ध्यान दें: शून्य मिटा (शुरू(), अंत())

पोस्ट: आकार() == 0.

चूंकि यह "प्रारंभ" से तत्वों को हटाने शुरू करता है, मुझे लगता है कि यह अनुमान लगाने के लिए सुरक्षित है कि उन्हें क्रम में हटा दिया जाएगा। अन्यथा यादृच्छिक अभिगम सूची तत्वों के लिए एक प्रदर्शन जुर्माना होगा।

+0

मुझे नहीं लगता कि यह एक सुरक्षित धारणा है, क्योंकि मिटाएं (q1, q2) तत्वों के विनाश के आदेश के बारे में कुछ भी नहीं कहती है। – juanchopanza

2

बस पूर्णता के लिए, सी ++ 11 मानक sequence containers के विनाश के आदेश को निर्धारित नहीं करता है, जिसमें से std::list सदस्य है। यह केवल इतना कहता है कि सभी तत्व नष्ट हो गए हैं, सभी संदर्भ, पॉइंटर्स और इटरेटर्स तत्वों का जिक्र करते हैं, और अतीत के अंतराल को अमान्य कर दिया जा सकता है। clear() के बारे में, यह erase(), begin() या end() का कोई उल्लेख नहीं करता है, एचटी सी ++ 03 मानक के विपरीत।

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

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