2009-01-29 6 views
23

क्या किसी को पता है क्यों std :: queue, std :: stack, और std :: priority_ priority_queue clear() सदस्य फ़ंक्शन प्रदान नहीं करते हैं? clear() सब कुछ है कि अंतर्निहित कंटेनर के रूप में सेवा कर सकता द्वारा प्रदान की गईमानक सी ++ कंटेनर एडाप्टर क्यों स्पष्ट कार्य प्रदान नहीं करते हैं?

std::queue<int> q; 
// time passes... 
q = std::queue<int>(); // equivalent to clear() 

IIRC,: मैं इस तरह नकली एक करना पड़ता है। क्या कंटेनर एडेप्टर इसे उपलब्ध कराने का कोई अच्छा कारण नहीं है?

उत्तर

18

ठीक है, मुझे लगता है कि ऐसा इसलिए है क्योंकि clear को कतार, प्राथमिकता_क्यू या स्टैक पर एक वैध ऑपरेशन नहीं माना गया था (वैसे, डेक नहीं है और एडाप्टर लेकिन कंटेनर है)।

कंटेनर Deque यह स्पष्ट करना आप केवल कतार ऑपरेशनों को यह है कि के बजाय कंटेनर एडाप्टर कतार उपयोग करने के लिए एकमात्र कारण है, और कोई अन्य कार्यों। (from the sgi page on queue)

तो कतार का उपयोग करते समय, आप जो भी कर सकते हैं वह पुश/पॉप तत्व है; कतार को समाशोधन को फीफो अवधारणा का उल्लंघन माना जा सकता है। नतीजतन, अगर आपको अपनी कतार को साफ़ करने की आवश्यकता है, तो शायद यह वास्तव में एक कतार नहीं है और आपको बेहतर डेक का उपयोग करना चाहिए।

हालांकि, चीजों की यह अवधारणा थोड़ा संकीर्ण है, और मुझे लगता है कि कतार को साफ़ करना आपके जैसा उचित है।

-1

मुझे लगता है कि यह कार्यान्वयन पर निर्भर करता है - हाल ही में माइक्रोसॉफ्ट एसटीएल ने कई कंटेनर पर स्पष्ट नहीं किया है। (यह अब करता है, उदाहरण के लिए this quick google result)

हालांकि, स्पष्ट() अक्सर मिटाने के लिए एक कॉल होता है (प्रारंभ(), अंत()), इसलिए अपने स्वयं के समकक्ष को लागू करें और इसके बजाय इसका उपयोग करें।

मुझे लगता है कि मानक एक इटरेटर रेंज पर मिटाने के रूप में स्पष्ट है, इसलिए उपरोक्त सबसे अधिक कार्यान्वयन प्रदान करेगा। (eg Dinkumware's)

+3

स्टैक, कतार और प्राथमिकता_क्यू में इटरेटर नहीं हैं। – Reunanen

11

डेक स्पष्ट() है। देखें, उदाहरण के लिए, http://www.cplusplus.com/reference/stl/deque/clear.html

हालांकि, कतार नहीं है। लेकिन आप डेक पर कतार क्यों चुनेंगे, वैसे भी?

कंटेनर Deque यह स्पष्ट करना आप केवल कतार ऑपरेशनों को यह है कि के बजाय कंटेनर एडाप्टर कतार उपयोग करने के लिए एकमात्र कारण है, और कोई अन्य कार्यों।

(http://www.sgi.com/tech/stl/queue.html)

तो मैं स्पष्ट() एक कतार आपरेशन नहीं है, तो लगता है।

2

मैं यह कहूंगा क्योंकि कंटेनर एडाप्टर कंटेनर नहीं हैं।

-2

std :: queue, std :: deque, और std :: primary_queue कंटेनर एडाप्टर हैं और अंतर्निहित कंटेनर तक पहुंचने के लिए केवल कुछ ही तरीकों को प्रदान करते हैं।

आप अंतर्निहित कंटेनर को साफ़ कर सकते हैं, जब तक आप इसे एक्सेस कर सकें। ऐसा करने के लिए, एपैप्टर कन्स्ट्रक्टर में पास करने के लिए अंतर्निहित कंटेनर बनाएं।

std::deque<int> d; 
std::queue<int> q(d); 

... time passes ... 

d.clear(); 

संपादित करें: उदाहरण के लिए: अतिरिक्त जानकारी

मैं भी अंतर्निहित कंटेनर पर तरीकों बुला अनुकूलक द्वारा बनाई गई मान्यताओं टूट सकता है के रूप में ध्यान से यहां पर चलने का आप ने चेतावनी दी है चाहिए। उस संबंध में, जिस तरह से आप वर्तमान में कतार को साफ़ कर रहे हैं, वह बेहतर लगता है।

+1

डैनियल, यह सही नहीं है, कतार के लिए कन्स्ट्रक्टर तर्क केवल वास्तविक कंटेनर के संदर्भ को पारित करने के लिए नहीं, _initializing_ कतार के लिए उपयोग किया जाता है। दूसरे शब्दों में, 'क्यू' को 'डी' सामग्री के साथ शुरू किया जाएगा, लेकिन समाशोधन 'डी' 'क्यू' को प्रभावित नहीं करेगा। – codelogic

+0

दिलचस्प - मैंने जिन रचनाकारों को देखा वह संग्रह के लिए एक संदर्भ संदर्भ नहीं लेते थे ... –

+1

पुन: प्रयास करें - आप सही हैं। एडेप्टर एक संग्रह धारण करते हैं, संदर्भ नहीं और एडाप्टर के रचनाकार प्रारंभिकरण के लिए संग्रह के लिए एक कॉन्स्ट संदर्भ लेते हैं। दिलचस्प बात यह है कि वीएस -2008 में, कतार के "सी" सदस्य सार्वजनिक हैं! यह primary_queue में संरक्षित है। –

1

आप स्पष्ट कतार (और std :: स्टैक और प्राथमिकता_क्यू) कर सकते हैं, जब तक आप इसे प्राप्त करते हैं। कंटेनर जानबूझकर इसे अनुमति देने के लिए संरक्षित छोड़ दिया गया है।

+4

आपको मानक कंटेनर से सार्वजनिक रूप से उत्तराधिकारी नहीं होना चाहिए, भले ही आप आवृत्ति चर नहीं जोड़ते हैं: वर्चुअल विनाशक के बिना बेस क्लास पॉइंटर के माध्यम से व्युत्पन्न कक्षा को हटाने के परिणामस्वरूप अनिर्धारित व्यवहार (यह ** ** ** आधार पर कॉल करने की गारंटी नहीं है ** वर्ग विनाशक)। –

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