2013-02-20 63 views
11

वेक्टर पर clear() पर कॉल करने से वेक्टर में जो कुछ भी संग्रहीत किया जाता है, वह विनाशक कहलाता है, जो एक रैखिक समय ऑपरेशन है। लेकिन क्या यह मामला है जब वेक्टर में आदिम प्रकार होते हैं जैसे int या double?`std :: vector <primitive> :: स्पष्ट()` निरंतर समय ऑपरेशन है?

+1

तो हाँ, पुरातन पर स्पष्ट है हमेशा (या निरंतर, यह जब तक यह रेखीय की तुलना में अधिक नहीं है महत्वपूर्ण नहीं है) संभव डुप्लिकेट [std :: वेक्टर की जटिलता क्या है :: स्पष्ट() जब टी एक आदिम प्रकार है?] (http://stackoverflow.com/questions/11235975/what-is-the-complexity-of- stdvectortclear-when-t-is-a-primitive-type) – nneonneo

+0

[dd :: vector :: स्पष्ट, निरंतर समय?] (http://stackoverflow.com/questions/14094302/stdvectorintclear-constant-time का संभावित डुप्लिकेट) – jogojapan

उत्तर

2

पीओवी से इस बारे में सोचें कि vector कैसे लागू किया गया है। जब आप आह्वान करते हैं:

delete [] internalPtr; 

क्या होता है?

  • ढेर अंतरिक्ष के एक सन्निहित ब्लॉक
  • विनाशकर्ता आग चाहिए या internalPtr

पूर्व अभी भी आदिम प्रकार के लिए होना चाहिए में प्रत्येक वस्तु को पुनः प्राप्त करना होगा, लेकिन विनाशकर्ता उनके लिए मौजूद नहीं हैं। तो delete[] कितनी तेजी से ढेर इस लिंक में स्मृति

+4

कम से कम उपयोग कर रहे हैं डिफ़ॉल्ट आवंटक, 'std :: vector'' हटाएं [] internalPtr; 'का उपयोग नहीं करेगा। –

0

के एक ब्लॉक को नष्ट कर सकते पर पूरी तरह से आधारित निष्पादित करेंगे:

http://www.cplusplus.com/reference/vector/vector/clear/

इसे कहते हैं clear() की जटिलता आकार (विनाश) में रैखिक है।

+2

मैं इसे वापस करने के लिए वास्तव में C++ 11 मानक में कुछ भी नहीं ढूंढ सकता। लिंक गलत हो सकता है। – juanchopanza

4

मुझे विश्वास है कि उत्तर कार्यान्वयन निर्भर है। अधिकांश रैखिक समय पर लगता है, लेकिन कुछ कार्यान्वयन इसे अनुकूलित करने का विकल्प चुन सकते हैं।

प्रति 'Does clearing a vector affect its capacity?', न तो एमएसवीसी और न ही जी ++ उनके वैक्टरों की क्षमता को कम करता है, भले ही .clear कहा जाता है। जी ++ हेडर को देखते हुए, यह स्पष्ट है कि .clear डिफॉल्ट आवंटक के साथ निरंतर समय है, जब तक कि तत्व स्केलर (आदिम अंकगणितीय प्रकार या पॉइंटर्स) होते हैं।

+0

यह तथ्य के अनुरूप है कि मुझे मानक में 'वेक्टर :: स्पष्ट() '(या अनुक्रम कंटेनर' स्पष्ट() के बारे में कुछ भी नहीं मिला है। बेशक, यह मेरे लिए ठीक से खोज नहीं कर सकता है ... – juanchopanza

+0

@juanchopanza: मैंने spec में देखा है, और यह वास्तव में प्रतीत होता है [गायब हो रहा है] (http://stackoverflow.com/questions/14970747/is-the-complexity-of-vectorclear-unspecified)। नोट, हालांकि, 'मिटाएं (प्रारंभ करें), अंत())' प्रत्येक विनाशक को कॉल करने के लिए आवश्यक समय के बराबर समय लेने के लिए निर्दिष्ट किया गया है। – nneonneo

0

खैर .. यह कहना है कि स्पष्ट() रैखिक है, लेकिन हम यह भी जानते हैं कि यह हर आइटम की नाशक कॉल ...

http://www.cplusplus.com/reference/vector/vector/clear/

क्या होगा अगर नाशक कॉल IST रेखीय नहीं?

हालांकि, पुरातन पर नाशक-कॉल रेखीय है() एक रेखीय आपरेशन

+0

ओपी विशेष रूप से प्राइमेटिव्स के बारे में पूछता है, जिनमें छोटे विनाशक हैं। – nneonneo

+1

कहां कहता है कि यह रैखिक है? मैं इसे सी ++ 11 मानक में कहीं भी नहीं ढूंढ सकता, लेकिन मुझे कुछ याद आ रहा है। – juanchopanza

+0

@juanchopanza और nneonneo तय – cIph3r