QVector
जैसा std::vector
कि आप नाम से अनुमान लगा सकते हैं, ज्यादातर अनुरूप है । के साथ स्पष्ट सहयोग के बावजूद, QList
करीब है । यह वस्तुओं को सीधे स्टोर नहीं करता है, बल्कि उन्हें पॉइंटर्स को स्टोर करता है। आप दोनों सिरों पर त्वरित सम्मिलन के सभी लाभ प्राप्त करें और reallocations प्रतिलिपि कंस्ट्रक्टर्स के बजाय संकेत दिए गए फेरबदल को शामिल है, लेकिन एक वास्तविक की spacial इलाके खोना या , और ढेर आवंटन का एक बहुत प्राप्त करें। यह छोटी वस्तुओं के लिए ढेर के आवंटन से बचने के लिए कुछ निर्णय ले रहा है, जो स्थानिक इलाके को फिर से प्राप्त कर रहा है, लेकिन जो मैं समझता हूं कि यह केवल एक से छोटी चीजों पर लागू होता है ।boost::ptr_deque
std::list
std::deque
std::vector
int
QLinkedList
के अनुरूप है std::list
, और इसके सभी डाउनसाइड हैं। सामान्यतया, यह आपके कंटेनर का अंतिम विकल्प होना चाहिए।
क्यूटी लाइब्रेरी QList
वस्तुओं के उपयोग के लिए बहुत अनुकूल है , इसलिए अपने स्वयं के कोड में उनका पक्ष लेना कभी-कभी कुछ अस्वाभाविक टेडियम से बच सकता है। अतिरिक्त हीप का उपयोग और वास्तविक डेटा की यादृच्छिक स्थिति कुछ परिस्थितियों में सैद्धांतिक रूप से चोट पहुंचा सकती है, लेकिन बार-बार अप्रभावी है। इसलिए मैं सुझाव देता हूं कि QList
जब तक प्रोफाइलिंग एक को बदलने का सुझाव न दे QVector
। यदि आप सन्निहित आवंटन को महत्वपूर्ण होने की उम्मीद करते हैं [पढ़ें: आप कोड के साथ हस्तक्षेप कर रहे हैं जो T[]
एक QList<T>
] के बजाय उम्मीद करता है कि यह भी QVector
बल्ले से सही से शुरू करने का एक कारण हो सकता है ।
यदि आप सामान्य रूप से कंटेनरों के बारे में पूछ रहे हैं, और केवल संदर्भ के रूप में क्यूटी दस्तावेजों का उपयोग किया है, तो उपरोक्त जानकारी कम उपयोगी है।
एक std::vector
सरणी है जिसे आप आकार बदल सकते हैं। सभी तत्व एक-दूसरे के बगल में संग्रहीत होते हैं, और आप व्यक्तिगत तत्वों को जल्दी से एक्सेस कर सकते हैं। नकारात्मक पक्ष यह है कि सम्मिलन केवल एक छोर पर कुशल होते हैं। यदि आप बीच में या शुरुआत में कुछ डालते हैं, तो आपको कमरे बनाने के लिए अन्य वस्तुओं को कॉपी करना होगा। बड़े-ओह संकेतन में, अंत में सम्मिलन O (1) है, कहीं भी सम्मिलन O (N) है, और यादृच्छिक अभिगम O (1) है।
एक std::deque
समान है, लेकिन ग्वारेंटी वस्तुओं को एक दूसरे के बगल में संग्रहीत नहीं किया जाता है, और दोनों छोरों पर सम्मिलन की अनुमति देता है ओ (1)। इसे एक बार में आवंटित की जाने वाली मेमोरी के छोटे हिस्से की भी आवश्यकता होती है, जो कभी-कभी महत्वपूर्ण हो सकती है। रैंडम एक्सेस O (1) है और मध्य में सम्मिलन O (N) है, उसी तरह a के लिए vector
। स्थानिक इलाके की तुलना में बदतर है std::vector
, लेकिन वस्तुओं का क्लस्टर होना है तो आप कुछ लाभ प्राप्त करते हैं।
एक std::list
लिंक की गई सूची है। इसके लिए तीन मानक अनुक्रमिक कंटेनरों में से सबसे अधिक मेमोरी ओवरहेड की आवश्यकता होती है, लेकिन कहीं भी तेजी से प्रविष्टि प्रदान करता है ... बशर्ते आप पहले से जानते हों कि आपको कहां सम्मिलित करना है। यह व्यक्तिगत तत्वों तक यादृच्छिक पहुँच प्रदान नहीं करता है, इसलिए आपको O (N) में पुनरावृत्त करना होगा। लेकिन एक बार वहाँ, वास्तविक प्रविष्टि हे (1) है। इसका सबसे बड़ा लाभ यह std::list
है कि आप उन्हें एक साथ जल्दी से विभाजित कर सकते हैं ... यदि आप मानों की एक पूरी श्रृंखला को किसी भिन्न पर ले जाते हैं std::list
, तो पूरा ऑपरेशन O (1) है। सूची में संदर्भों को अमान्य करना भी बहुत कठिन है, जो कभी-कभी महत्वपूर्ण हो सकता है।
एक सामान्य नियम के रूप में, मैं पसंद std::deque
करता हूं std::vector
, जब तक कि मुझे एक लाइब्रेरी के लिए डेटा को पारित करने में सक्षम होने की आवश्यकता नहीं है जो कच्चे सरणी की अपेक्षा करता है। std::vector
सन्निहित गारंटी है, इसलिए &v[0]
इस उद्देश्य के लिए काम करता है। मुझे याद नहीं है कि पिछली बार मैंने एक का उपयोग किया था std::list
, लेकिन यह लगभग निश्चित रूप से था क्योंकि मुझे शेष वैध संदर्भों के बारे में मजबूत छाप की जरूरत थी।