2013-02-10 71 views
5

जहां तक ​​मैं समझता हूँ, Deque के पीछे प्रेरणा कुशल push_front के साथ एक यादृच्छिक अभिगम कंटेनर प्रदान करना है।क्यों std :: डेक इंडेक्स 0 से पहले आरक्षित स्मृति के साथ एक वेक्टर नहीं है?

डेक की तुलना में वेक्टर के आम तौर पर उद्धृत फायदे में तेजी से ट्रैवर्सल और at() शामिल हैं, लेकिन अधिकतर इसकी सी संगतता, क्योंकि यह संगत स्मृति की गारंटी देता है। डेक नहीं करता है, क्योंकि यह स्मृति के टुकड़ों का संग्रह है, प्रत्येक में कई मूल्य हैं।

मैं उलझन में हूँ। इंडेक्स size-1 के बाद आरक्षित मेमोरी के अतिरिक्त इंडेक्स 0 से पहले आरक्षित वेक्टर की तरह डेक क्यों नहीं बनाया गया है? यह संगत स्मृति की गारंटी देगा, प्रभावी push_front सक्षम करेगा और इटरेटर्स को डिफ्रेंस करते समय भी अतिरिक्त संकेत से बचें।

प्रविष्टि के दौरान स्थानांतरण को कम से कम करने के लिए, निहित मूल्यों सम्मिलन बिंदु पर निर्भर करेगा स्थानांतरित कर दिया जाए। यदि सूचकांक nsize()/2 से पहले होने पर, n तक मूल्यों को स्थानांतरित करें। अन्यथा n के बाद मानों को सही स्थानांतरित करें।

मैं क्या याद था कि इतना महत्वपूर्ण है कि Deque मूल्यों की सरणियों का एक संग्रह है और एक बड़ा सरणी है?

+0

परिशोधित लागत, हो सकता है? तेज़ 'push_front'' deque' –

+1

के लिए एकमात्र आवश्यकता नहीं है और आप कितनी मेमोरी आरक्षित करेंगे? 1 केबी, 10 केबी, 1 एम, 1 जीबी, 24 जीबी? आप जो कुछ भी करते हैं, कोई शिकायत करेगा कि यह बहुत अधिक है या पर्याप्त नहीं है ... –

+0

अफैक जिस तरह से क्यूटी अपने QList – BeniBela

उत्तर

8

According to Wikipedia, क्या आप का वर्णन कर रहे हैं, वास्तव में एक संभव कार्यान्वयन है कम से कम सामान्य रूप में।

हालांकि, सी ++ मानक आवश्यकताओं कि अनिवार्य रूप से std::deque के लिए एक कार्यान्वयन के रूप में इस पर रोक लगाने लगाता है; [Deque.modifiers] कहता है:

एक प्रविष्टि Deque के दोनों छोर पर ... Deque के तत्वों के लिए संदर्भ की वैधता पर कोई प्रभाव नहीं है।

(धन्यवाद @BenjaminLindley लिए!)

+0

मैं एक जवाब के लिए STFW, लेकिन विकिपीडिया जैसे विषयों (के लिए मेरे मन में आम तौर पर नहीं आता है: – Gabriel

+4

23.3.3.4/1 और/4 का कहना है कि प्रविष्टि या Deque के सिरों पर हटाने संदर्भ अमान्य नहीं करेगा कि wouldn '। यदि Deque इस तरह से काम किया है टी संभव हो सकता है। (मैं iterators से पहले कहा, लेकिन यह केवल संदर्भ है) –

+0

तो कार्यान्वयन कि reallocs साथ सन्निहित स्मृति पर भरोसा मानक अनुरूप नहीं हैं? मुझे लगता है कि अन्य कार्यान्वयन एक 'c_array' साथ सी अनुकूलता प्रदान कर सकता है फ़ंक्शन, 'स्ट्रिंग :: c_str' की तरह, जो सभी हिस्सों को एक बड़े में रीपैक करेगा और आवेषण द्वारा अमान्य हो जाएगा। – Gabriel