2016-02-19 9 views
10

मेरे पास पॉइंटर्स का एक सेट है। पहले चरण में, मैं डेटा पॉइंटर्स डालता हूं, और दूसरे चरण में, मैं पूरे सेट पर पुन: प्रयास करता हूं और तत्वों के साथ कुछ करता हूं। ऑर्डर महत्वपूर्ण नहीं है, मुझे सिर्फ डुप्लीकेट से बचने की ज़रूरत है, जो पॉइंटर तुलना के साथ ठीक काम करता है।क्या मुझे पॉइंटर्स के सेट के लिए std :: set या std :: unordered_set का उपयोग करना चाहिए?

मेरा सवाल यह है कि क्या एक ही उद्देश्य के लिए एक असाधारण सेट का उपयोग करना फायदेमंद हो सकता है। एक unordered सेट के लिए सम्मिलन तेजी से है?

+4

"आदेश महत्वपूर्ण नहीं है" - एक बार जब आप उस पर निर्णय लेते हैं, तो 'unordered_set' का उपयोग करें। आदेशित कंटेनरों का एकमात्र एडवांटेज .. ऑर्डर है। –

+0

हम कितने तत्वों के बारे में बात कर रहे हैं? और क्या आप प्रत्येक आइटम पर गहन काम की गणना करते हैं या यह सभी तत्वों को संक्षेप में/गुणा करने जैसा है? – MikeMB

+2

आदेशित कंटेनरों का एक और महत्वपूर्ण लाभ यह है कि यह प्रत्येक ऑपरेशन के लिए समय की गारंटी दे सकता है ओ (एलजी एन) जबकि अनियंत्रित लोगों को सबसे खराब मामले में ओ (एन) की आवश्यकता होती है। तो यदि आप जटिलता के बारे में वादा करना चाहते हैं, तो std :: set का उपयोग करें। – James

उत्तर

6

जैसा कि अमी टैवरी ने टिप्पणी की है, अगर आपको आदेश की आवश्यकता नहीं है, तो आमतौर पर अनियंत्रित कंटेनरों के लिए जाना सबसे अच्छा होता है। इसका कारण यह है कि यदि आदेश किसी भी तरह से प्रदर्शन में सुधार हुआ है, तो अनियंत्रित कंटेनर अभी भी इसका उपयोग करने के लिए स्वतंत्र होंगे, और इसलिए किसी भी तरह की या समान जटिलता प्राप्त करें।

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

सी ++ के मानक पुस्तकालय में, std::set के लिए औसत प्रविष्टि जटिलता, हे (लॉग (एन)) है जबकि std::unordered_set के लिए यह हे (1) है। इसके अलावा, std::unordered_set का उपयोग करते समय औसत पर शायद कम कैश याद आती है।

हालांकि दिन के अंत में, यह केवल सिद्धांत है। आपको कुछ ऐसा करने की कोशिश करनी चाहिए जो पर्याप्त अच्छी लगती है और यह देखने के लिए प्रोफाइल करें कि यह वास्तव में है या नहीं।

+1

पॉइंटर्स के लिए, जो सवाल है, मानक पुस्तकालय में 'std :: हैश'' का विशेषज्ञता है, इसलिए चिंता करने की कोई बात नहीं है। –

+0

विचार करने की एक और बात यह है कि असंबद्ध पॉइंटर्स की तुलना करने का व्यवहार (समान सरणी या उसी वस्तु में इंगित नहीं करना) अनिर्धारित है। तो, सख्ती से बोलते हुए, 'std :: set' –

+0

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

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