क्यों करता है std :: स्टैक का उपयोग std :: deque by default?


91

चूंकि एक कंटेनर के लिए केवल एक स्टैक में उपयोग किए जाने वाले आवश्यक संचालन हैं:

  • वापस()
  • पीछे धकेलना()
  • pop_back ()

एक वेक्टर के बजाय एक डिक्स के लिए डिफ़ॉल्ट कंटेनर क्यों है?

सामने वाले () से पहले तत्वों का बफर न दें, ताकि पुश_फ्रंट () एक कुशल संचालन हो? इन तत्वों को बर्बाद नहीं किया जाता है क्योंकि वे कभी एक स्टैक के संदर्भ में उपयोग नहीं किए जाएंगे?

यदि वेक्टर के बजाय इस तरह से एक deque का उपयोग करने के लिए कोई ओवरहेड नहीं है, तो प्राथमिकता के लिए डिफ़ॉल्ट क्यों है_ एक वेक्टर भी एक deque नहीं है? (प्रायोरिटी_क्व्यू के लिए फ्रंट (), पुश_बैक (), और पॉप_बैक () की आवश्यकता होती है - अनिवार्य रूप से स्टैक के लिए समान है)


नीचे दिए गए उत्तरों के आधार पर अपडेट किया गया:

ऐसा प्रतीत होता है कि जिस तरह से डॉक आमतौर पर लागू किया जाता है वह निश्चित आकार के सरणियों का एक चर आकार का सरणी है। यह एक वेक्टर की तुलना में तेजी से बढ़ रहा है (जिसके लिए वास्तविककरण और प्रतिलिपि बनाने की आवश्यकता होती है), इसलिए एक स्टैक की तरह कुछ के लिए जो तत्वों को जोड़ने और हटाने के बारे में है, deque एक बेहतर विकल्प है।

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


1
आपके 'अपडेट' में तर्क बिल्कुल सही नहीं है। वेक्टर सामान्य रूप से जोड़ता है और एक छल की तुलना में तेजी से अंत से तत्वों को निकालता है । स्मरण शक्ति बढ़ने के लिए तेज है , तत्वों को आगे नहीं बढ़ाना
मूंग डक

जवाबों:


75

जैसे ही कंटेनर बढ़ता है, एक वेक्टर के लिए एक पुन: स्थापन को स्मृति के नए ब्लॉक में सभी तत्वों को कॉपी करने की आवश्यकता होती है। एक deque बढ़ने से एक नया ब्लॉक आवंटित होता है और इसे ब्लॉक की सूची से जोड़ता है - किसी भी कॉपी की आवश्यकता नहीं होती है।

बेशक आप यह निर्दिष्ट कर सकते हैं कि यदि आप चाहें तो एक अलग बैकिंग कंटेनर का उपयोग किया जा सकता है। इसलिए यदि आपके पास एक स्टैक है जिसे आप जानते हैं कि बहुत बढ़ने वाला नहीं है, तो इसे अपनी पसंद के अनुसार एक छल के बजाय एक वेक्टर का उपयोग करने के लिए कहें।


1
लेकिन जब पॉइंटर्स टू ब्लॉक्स की सूची बढ़ती है, तो इस सूची को कभी-कभी एक वेक्टर की तरह ही पुन: प्राप्त किया जाना चाहिए; asymptotically, दक्षता में किसी भी लाभ सबसे अच्छा पर एक स्थिर कारक द्वारा है। और इसे ठीक करने के लिए पुशटर और पॉप को सही ढंग से करने के लिए आवश्यक इटरेटर हेरफेर इसके लिए बहुत अधिक जटिल std::dequeहै std::vector, और इन ऑपरेशनों को वास्तविकताओं की तुलना में बहुत अधिक बार उपयोग किए जाने की संभावना है। मेरा मानना ​​है कि अभ्यास में std::dequeकभी भी हार होगी std::vector
मार्क वैन लीउवेन

@ मिचेल बूर: फिर क्यों नहीं list, क्यों का उपयोग करें deque?
बप्पक २ b

@MarcvanLeeuwen के बारे में आप कहते हैं कि आप एक कठिन समय मानते हैं ... क्या आप कृपया एक स्पष्ट दृष्टिकोण बना सकते हैं? क्या आपका मतलब है कि अब आप विश्वास कर रहे हैं कि अभ्यास में हारने का std::dequeमौका है std::vector, या क्या आपका मतलब है कि आपको अभी भी संदेह है? धन्यवाद।
एनाफुली

@fleix मैं नहीं दिख रहा है कारण है कि यह बहुत महत्वपूर्ण है कि क्या मैं व्यक्तिगत रूप से एक आसान समय विश्वास है कि राशि std::dequeके रूप में के रूप में अच्छा प्रदर्शन करेंगे std::vectorव्यावहारिक अनुप्रयोगों में। लेकिन इसके लायक के लिए, मेरा व्यक्तिगत अनुभव यह है कि मुझे एक बड़े और जटिलता-महत्वपूर्ण कार्य के लिए नहीं बल्कि ढेर सारे छोटे डेटा स्ट्रक्कों और कतार डेटा संरचनाओं की आवश्यकता है, जो मेरे कोड के माध्यम से छिड़के गए हैं। जैसे कि मैं बड़े की तुलना में छोटे में व्यवहार के बारे में अधिक परवाह करता हूं; और वहाँ विशेष रूप से सुस्त चमकता है। मेरी प्राथमिकता न तो उपयोग करना है, बल्कि (स्व-कार्यान्वित) इसके बजाय एकल रूप से जुड़ी हुई सूचियाँ हैं। लेकिन आप लाभ भिन्न हो सकते हैं।
मार्क वैन लीउवेन

12

वेक्टर और डीके के सापेक्ष गुणों के लिए हर्ब सटर के सप्ताह के गुरु को देखें, जहां या तो करेंगे।

मैं कल्पना करता हूं कि प्राथमिकता_के और कतार के बीच असंगतता बस यह है कि विभिन्न लोगों ने उन्हें लागू किया।


2
प्रायोरिटी_क्व्यू वास्तव में पुश / पॉप_फ्रंट का उपयोग नहीं करता है, और पहले के अलावा तत्वों के संदर्भ ढेर के संचालन द्वारा अमान्य हैं। तो, एक नियमित रूप से कतार के मामले के विपरीत, deque का कोई भी लाभ लागू नहीं होगा।
पोटाटोज़वाटर

9
इसके अलावा, priority_queueक्रमबद्ध रहना चाहिए, इसलिए बेतरतीब ढंग से पहुंच के उच्च ओवरहेड deque::iteratorअधिक समस्याग्रस्त है।
पोटाटोज़वाटर

1
@Potatoswatter: priority_queueमें एक "मैजिक ऑर्डर" है जिसे बनाए रखा जाता है, इसे सॉर्ट नहीं किया जाता है। हालाँकि, आपकी बात खड़ी होती है।
मूविंग डक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.