चूंकि उत्तर के असंख्य हैं, आप भ्रमित हो सकते हैं, लेकिन संक्षेप में:
एक का उपयोग करें std::queue
। इसका कारण सरल है: यह एक फीफो संरचना है। आप FIFO चाहते हैं, आप एक का उपयोग करें std::queue
।
यह आपके इरादे को स्पष्ट करता है किसी और को, और यहाँ तक कि खुद को भी। A std::list
या std::deque
नहीं। एक सूची कहीं भी सम्मिलित और हटा सकती है, जो कि ऐसा नहीं है जिसे एक फीफो संरचना को करने के लिए माना जाता है, और deque
दोनों छोर से एक जोड़ और हटा सकते हैं, जो कि एक ऐसी चीज है जिसे कोई फीफो संरचना नहीं कर सकती है।
यही कारण है कि आपको एक का उपयोग करना चाहिए queue
।
अब, आपने प्रदर्शन के बारे में पूछा। सबसे पहले, हमेशा अंगूठे के इस महत्वपूर्ण नियम को याद रखें: अच्छा कोड पहले, प्रदर्शन अंतिम।
इसका कारण सरल है: जो लोग स्वच्छता और लालित्य से पहले प्रदर्शन के लिए प्रयास करते हैं, वे हमेशा अंतिम रूप से समाप्त होते हैं। उनका कोड एक प्रकार का मूस बन जाता है, क्योंकि उन्होंने वह सब त्याग दिया है जो वास्तव में अच्छा है ताकि इससे कुछ भी न निकले।
पहले अच्छा, पठनीय कोड लिखकर, आपमें से अधिकांश प्रदर्शन समस्याएं स्वयं हल कर लेंगे। और अगर बाद में आपको पता चलता है कि आपके प्रदर्शन में कमी है, तो अब अपने अच्छे, साफ कोड में एक प्रोफाइलर को जोड़ना आसान है, और यह पता लगाएं कि समस्या कहाँ है।
यह सब कहा, std::queue
केवल एक एडाप्टर है। यह सुरक्षित इंटरफ़ेस प्रदान करता है, लेकिन अंदर एक अलग कंटेनर का उपयोग करता है। आप इस अंतर्निहित कंटेनर को चुन सकते हैं, और यह लचीलेपन का एक अच्छा सौदा करने की अनुमति देता है।
तो, आपको किस अंतर्निहित कंटेनर का उपयोग करना चाहिए? हम यह जानते हैं std::list
और std::deque
दोनों आवश्यक कार्यों प्रदान करते हैं ( push_back()
, pop_front()
, और front()
), तो हम कैसे तय करते हैं?
सबसे पहले, यह समझें कि मेमोरी (और डीलिंग) को आवंटित करना आम तौर पर करने के लिए एक त्वरित बात नहीं है, क्योंकि इसमें ओएस से बाहर जाना और कुछ करने के लिए पूछना शामिल है। A list
को हर बार जब कुछ जोड़ा जाता है, तो मेमोरी आवंटित करना पड़ता है और जब वह चला जाता है तो उसे डीलिट कर देता है।
deque
दूसरी ओर ए , चंक्स में आवंटित करता है। यह एक से कम बार आवंटित करेगा list
। इसे एक सूची के रूप में सोचें, लेकिन प्रत्येक मेमोरी चंक में कई नोड हो सकते हैं। (बेशक, मेरा सुझाव है कि आप वास्तव में सीखें कि यह कैसे काम करता है ।)
इसलिए, इसके साथ ही deque
बेहतर प्रदर्शन करना चाहिए, क्योंकि यह अक्सर मेमोरी से निपटता नहीं है। इस तथ्य के साथ मिश्रित कि आप निरंतर आकार के डेटा को संभाल रहे हैं, इसे संभवतः डेटा के माध्यम से पहले पास के बाद आवंटित नहीं करना होगा, जबकि एक सूची लगातार आवंटित और डीलिंग होगी।
समझने के लिए एक दूसरी बात कैश परफॉर्मेंस है । रैम के लिए बाहर जाना धीमा है, इसलिए जब सीपीयू को वास्तव में ज़रूरत होती है, तो वह इस समय को मेमोरी के साथ वापस कैश में ले जाकर इस समय को सर्वश्रेष्ठ बना देता है। क्योंकि deque
मेमोरी चंक्स में एक आवंटन होता है, इसलिए यह संभावना है कि इस कंटेनर में एक तत्व तक पहुंचने से सीपीयू बाकी कंटेनर को भी वापस लाएगा। अब deque
वसीयत को आगे बढ़ाना त्वरित होगा, क्योंकि डेटा कैश में है।
यह एक सूची के विपरीत है, जहां डेटा को एक बार में आवंटित किया जाता है। इसका मतलब है कि मेमोरी में सभी जगहों पर डेटा फैल सकता है, और कैश का प्रदर्शन खराब होगा।
इसलिए, इस पर विचार करते हुए, deque
एक बेहतर विकल्प होना चाहिए। यही कारण है कि यह एक का उपयोग करते समय डिफ़ॉल्ट कंटेनर है queue
। उस सभी ने कहा, यह अभी भी केवल एक (बहुत) शिक्षित अनुमान है: आपको इस कोड को प्रोफाइल करना होगा, deque
एक परीक्षण list
में और दूसरे में वास्तव में कुछ जानने के लिए।
लेकिन याद रखें: एक साफ इंटरफ़ेस के साथ काम करने वाला कोड प्राप्त करें, फिर प्रदर्शन के बारे में चिंता करें।
जॉन चिंता जताता है कि लपेटने list
या deque
प्रदर्शन में कमी आएगी। एक बार फिर, वह और न ही मैं खुद को रूपरेखा के बिना कुछ के लिए कह सकता हूं, लेकिन संभावना है कि कंपाइलर उन कॉल को इनलाइन करेगा जो queue
बनाता है। यही है, जब आप कहते हैं queue.push()
, यह वास्तव में सिर्फ कहेगा queue.container.push_back()
, फ़ंक्शन कॉल को पूरी तरह से छोड़ देगा।
एक बार फिर, यह केवल एक शिक्षित अनुमान है, लेकिन queue
जब अंतर्निहित कंटेनर कच्चे का उपयोग करने की तुलना में एक विल का उपयोग प्रदर्शन को नीचा नहीं करेगा। जैसे मैंने पहले कहा है, का उपयोग करें queue
, क्योंकि यह साफ है, उपयोग करने में आसान है, और सुरक्षित है, और अगर यह वास्तव में एक समस्या प्रोफ़ाइल और परीक्षण बन जाता है।