2010-05-13 11 views
29

मैं एक जावा डेवलपर हूं जो सी ++ सीखने की कोशिश कर रहा है। मैंने इंटरनेट पर कई बार पढ़ा है (स्टैक ओवरफ्लो समेत) कि एसटीएल सबसे अच्छी संग्रह लाइब्रेरी है जिसे आप भाषा में प्राप्त कर सकते हैं। (क्षमा करें, मेरे पास इसके लिए कोई उद्धरण नहीं है)एसटीएल के बारे में इतना अच्छा क्या है?

हालांकि कुछ एसटीएल का अध्ययन करने के बाद, मैं वास्तव में यह देखने में विफल रहा हूं कि एसटीएल इतना खास क्या बनाता है। क्या आप अन्य भाषाओं के संग्रह पुस्तकालयों के अलावा एसटीएल को सेट करने के बारे में कुछ प्रकाश डालेंगे और इसे सर्वोत्तम संग्रह पुस्तकालय बना देंगे?

+15

एसटीएल यह सी ++ मानक का एक हिस्सा है, "विशेष" नहीं है। 'बूस्ट' विशेष है। –

+11

ओह हाँ, एसटीएल ** बहुत ** विशेष है। अन्य सभी मानक पुस्तकालयों को देखें और आप देखेंगे कि एसटीएल कितना विशेष है। – wilhelmtell

+3

@ किरील: कड़ाई से बोलते हुए, एसटीएल पूरी तरह संदिग्ध है। सी ++ में एसटीएल की कोई अवधारणा नहीं है, केवल मानक लाइब्रेरी है। एसटीएल मानक पुस्तकालय के टेम्पलेट भागों या एसजीआई द्वारा प्रकाशित मूल मानक टेम्पलेट लाइब्रेरी, या यहां तक ​​कि कुछ और भी संदर्भित कर सकता है। – GManNickG

उत्तर

23

एसटीएल के बारे में इतना अच्छा क्या है?

एसटीएल बहुत अच्छा है कि इसे बहुत जल्दी माना गया था और फिर भी सी ++ जेनेरिक प्रोग्रामिंग प्रतिमान का उपयोग करने में काफी सफल रहा। उन पर संचालित करने के लिए copy, transform ... टेम्पलेट्स का लाभ लेने के ऐसा करने के लिए vector, map, ... और एल्गोरिदम:

यह कुशलता से डेटा संरचनाओं अलग कर दिया।

यह बड़े करीने से चिंताओं decoupled और अनुकूलन (Comparator और Allocator टेम्पलेट पैरामीटर) के हुक के साथ सामान्य कंटेनर प्रदान की है।

परिणाम बहुत ही सुरुचिपूर्ण (डीआरवाई सिद्धांत) है और संकलक अनुकूलन के लिए बहुत ही कुशल धन्यवाद ताकि किसी दिए गए कंटेनर के लिए हाथ से उत्पन्न एल्गोरिदम बेहतर करने की संभावना न हो।

इसका यह भी मतलब है कि यह आसानी से एक्स्टेंसिबल है: आप, जब तक कि यह एसटीएल अनुरूप iterators आप इसके साथ एसटीएल एल्गोरिदम का उपयोग कर सकेंगे को उजागर करता है अंतरफलक आप चाहते हैं के साथ अपने स्वयं कंटेनर बना सकते हैं!

और लक्षणों के उपयोग के लिए धन्यवाद, आप सादे पॉइंटर्स के माध्यम से सी-सरणी पर एल्गोरिदम भी लागू कर सकते हैं! पिछड़े संगतता के बारे में बात करो!

हालांकि, यह (शायद) बेहतर हो सकता था ...

क्या एसटीएल के बारे में इतना महान नहीं है?

यह वास्तव में मुझसे दूर pisses है कि एक हमेशा iterators का उपयोग करना होगा, मैं वास्तव में लिखने के लिए सक्षम होने के लिए खड़े हैं: std::foreach(myVector, [](int x) { return x+1;}); क्योंकि चेहरा यह, बार आप कंटेनर के पूरे से अधिक पुनरावृति करना चाहते हैं के सबसे। ..

लेकिन क्या बदतर है है उसकी वजह से है कि:

set<int> mySet = /**/; 

set<int>::const_iterator it = std::find(mySet.begin(), mySet.end(), 1005); // [1] 
set<int>::const_iterator it = mySet.find(1005); // [2] 

[1] और [2], पूरी तरह से अलग तरह से किया जाता है [1] में जिसके परिणामस्वरूप होने हे (एन) जटिलता [2] हे (लॉग एन) जटिलता है, जबकि! यहां समस्या यह है कि iterators सार बहुत अधिक है।

मेरा मतलब यह नहीं है कि इटरेटर योग्य नहीं हैं, मेरा मतलब यह है कि इटरेटर के मामले में विशेष रूप से प्रदान करना एक खराब विकल्प था।

मैं खुद को विचार पर कंटेनर पर विचार पसंद करता हूं, उदाहरण के लिए Boost.MPL के साथ क्या किया गया है, इसकी जांच करें। एक दृश्य के साथ आप परिवर्तन के एक (आलसी) परत के साथ अपने कंटेनर में हेरफेर। यह बहुत ही कुशल संरचनाओं कि आप कुछ तत्वों को फ़िल्टर करने, दूसरों आदि को बदलने की अनुमति देता है के लिए बनाता है ...

विचारों और अवधारणा विचारों जाँच हैं, मुझे लगता है, एसटीएल एल्गोरिदम के लिए एक बेहतर इंटरफ़ेस उत्पादन का मेल (और इस find, lower_bound, upper_bound, equal_range समस्या को हल करें)।

यह भी iterators की ख़राब ढंग से परिभाषित सीमाओं और अपरिभाषित व्यवहार है कि इसके बारे में परिणाम का उपयोग कर के आम गलतियों से बच जाएंगे ...

+2

कम से कम सी ++ 0x में आपके पास इटेटर के लिए प्रत्येक लूप पहुंच होगी! –

+0

आपकी अधिकांश पकड़ें एसटीएल के बजाए सी ++ भाषा के साथ समस्याएं हैं। +1 हालांकि - मैं पकड़ से सहमत हूं। –

+2

दोनों विचार और अवधारणाओं की जांच सी ++ के भीतर उपलब्ध है (हालांकि आपको उन्हें प्राप्त करने के लिए काम करना पड़ सकता है)। दृश्य कंटेनर एडेप्टर (प्रतिनिधि भंडारण के साथ) और बूस्ट के समान हैं। कॉन्सेप्ट जिंदा और लात मार रहा है। मेरे पास यह समस्या इटरेटर के साथ है, सी ++ नहीं :) –

3

ठीक है, यह कुछ हद तक एक बोल्ड दावा है ... शायद सी ++ 0x में जब इसे अंततः हैश नक्शा (std :: unordered_map के रूप में) मिलता है, तो यह दावा कर सकता है, लेकिन इसके वर्तमान में राज्य, ठीक है, मैं इसे नहीं खरीदता।

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

+1

पुन: कोड डुप्लिकेशन, कुछ लिंकर्स एक ही प्रतिलिपि (जैसे एमएस/जी विकल्प) में समान कार्यों को जोड़ सकते हैं - इसलिए कोई भी कोड जो रेखांकित नहीं है, को डुप्लिकेट नहीं किया जाएगा। और यदि आप आकार (गति नहीं) के लिए ऑप्टिमाइज़ करने के विकल्प निर्दिष्ट करते हैं, तो फ़ंक्शंस केवल तभी किया जाएगा जब ऐसा करने से वास्तव में छोटे कोड उत्पन्न होते हैं। यह भी सुनिश्चित नहीं है कि "गतिशील रनटाइम टाइपिंग" से आपका क्या मतलब है - केवल पॉइंटर्स के कंटेनर (या क्लीनअप को आसान बनाने के लिए स्मार्ट पॉइंटर्स) का उपयोग करें। –

26

यह इतना नहीं है कि यह "महान" या "किसी भी * भाषा में प्राप्त सर्वोत्तम संग्रह लाइब्रेरी" है, लेकिन इसमें कई अन्य भाषाओं के लिए एक अलग दर्शन है।

विशेष रूप से, मानक सी ++ पुस्तकालय बल्कि एक वस्तु उन्मुख प्रतिमान की तरह जावा और सी # भाषाओं में आम है कि तुलना में, एक सामान्य प्रोग्रामिंग प्रतिमान का उपयोग करता है। यही है, आप क्या एक iterator होना चाहिए की एक "सामान्य" परिभाषा है, और फिर आप समारोह को लागू कर सकते for_each या sort या max_element कि वास्तव में कुछ आधार "से विरासत के बिना, किसी भी वर्ग कि iterator पैटर्न को लागू करता है लेता है Iterator "इंटरफ़ेस या जो कुछ भी।

+2

असल में "स्थिर बतख टाइपिंग" दृष्टिकोण सी # कंपाइलर द्वारा कंटेनरों पर भी लागू होता है। 'foreach' किसी भी ऑब्जेक्ट पर गिनती कर सकता है जिसमें' GetEnumerator' विधि है, और संग्रह प्रारंभकर्ता किसी भी 'आईनेमरेबल' ऑब्जेक्ट पर काम करते हैं, जिसमें * भी * जोड़ें 'विधि है - इसलिए इसे विधि के नाम और हस्ताक्षर मिलते हैं, भले ही प्रकार वे सी ++ टेम्पलेट्स की तरह परिभाषित हैं। –

+2

हा! मैं एक 'इंटरएटर' देखता हूं - मेरी इच्छा है कि जब भी मैंने इसे टाइप किया है तो मेरे पास $ 1 था। मांसपेशियों की याददाश्त हमारे खिलाफ काम कर रही है :( – msandiford

+0

@ स्पोंग: इसे आपके लिए संपादित किया गया :) – missingfaktor

13

एसटीएल के कंटेनर अच्छे हैं, लेकिन वे अन्य प्रोग्रामिंग भाषाओं में आपको ढूंढने से कहीं अलग नहीं हैं। एसटीएल कंटेनर उपयोगी क्या बनाता है कि वे एल्गोरिदम के साथ खूबसूरती से जाल। मानक एल्गोरिदम द्वारा प्रदान की गई लचीलापन अन्य प्रोग्रामिंग भाषाओं में बेजोड़ है।

एल्गोरिदम के बिना, कंटेनर बस यही हैं। कंटेनरों। विशेष रूप से विशेष कुछ भी नहीं।

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

+2

किसी भी सभ्य कंपाइलर पर उल्लेख नहीं है, एसटीएल सुपर-अनुकूलित है। – Anthony

+0

@ डूरसेल: किसी भी अन्य लाइब्रेरी को समान रूप से अनुकूलित किया जा सकता है - और वास्तव में इसे और भी अनुकूलित किया जा सकता है यदि कोई गारंटी देता है कि एसटीएल इसके संग्रह के बारे में बताता है। –

+0

हां और नहीं। अधिकांश अन्य पुस्तकालयों में संकेत, इंटरफेस, विरासत और ऐसी रनटाइम-लागू सुविधाओं पर भारी निर्भरता है। एसटीएल को तुच्छ रूप से अनुकूलित किया जा सकता है, जब तक आपके पास एक इनलाइनिंग कंपाइलर हो, क्योंकि संकलन-समय पर सभी अमूर्त मूल्यांकन का मूल्यांकन किया जाता है। – jalf

8

यह प्रत्यक्ष उत्तर नहीं है, लेकिन जैसा कि आप जावा से आ रहे हैं, मैं इसे इंगित करना चाहता हूं। जावा समकक्षों की तुलना में, एसटीएल वास्तव में तेज है।

मुझे कुछ प्रदर्शन तुलना दिखाते हुए this page मिला। जब आम तौर पर प्रदर्शन वार्तालापों की बात आती है तो जावा लोग बहुत स्पर्श करते हैं, और दावा करेंगे कि सभी प्रकार की प्रगति हर समय होती है। हालांकि सी/सी ++ कंपाइलर्स में भी इसी तरह की प्रगति हो रही है।

+2

यह एक अच्छा मुद्दा है - क्या आप इस पर किसी भी डेटा से लिंक कर सकते हैं? अच्छी तरह से लिखित और सूचनात्मक उत्तर – JBRWilkinson

20

मुझे एसटीएल के बारे में क्या पसंद है यह कितना मजबूत है। इसे विस्तारित करना आसान है।कुछ शिकायत करते हैं कि यह छोटा है, कई आम एल्गोरिदम या इटरेटर गायब हैं। लेकिन यह ठीक है जब आप देखते हैं कि आपको आवश्यक लापता घटकों में जोड़ना कितना आसान है। इतना ही नहीं, लेकिन छोटा सुंदर है: आपके पास लगभग 60 एल्गोरिदम हैं, कुछ हद तक कंटेनर हैं और इसके कुछ मुट्ठी भर हैं; लेकिन कार्यक्षमता इनके उत्पाद के क्रम में है। कंटेनर के इंटरफेस छोटे और सरल रहते हैं।

क्योंकि यह छोटे, सरल, मॉड्यूलर एल्गोरिदम लिखने के लिए फैशन है, यह आपके घटकों में बग और छेद को स्थानांतरित करना आसान हो जाता है। फिर भी, साथ ही, एल्गोरिदम और इटरेटर्स जितना सरल होते हैं, वे असाधारण रूप से मजबूत होते हैं: आपके एल्गोरिदम कई मौजूदा और अभी तक लिखे गए इटरेटर्स के साथ काम करेंगे और आपके इटरेटर कई मौजूदा और अभी तक- लिखित एल्गोरिदम।

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

निकलॉस विर्थ ने कहा कि एक प्रोग्राम एल्गोरिदम प्लस डेटा-स्ट्रक्चर है। एसटीएल के बारे में यही वही है। यदि रूबी और पायथन स्ट्रिंग सुपरहीरो हैं, तो सी ++ और एसटीएल एक एल्गोरिदम-और-कंटेनर सुपरहीरो हैं।

+1

+1 असल में, मुझे लगता है कि आपको यह पता चलेगा कि यह विर्थ नहीं था, नथ नहीं - यह उनकी (विर्थ की) किताबों में से एक का शीर्षक है। – Robb

+3

के लिए –

+1

@Neil धन्यवाद, मैं सही खड़ा हूँ। http://en.wikipedia.org/wiki/Algorithms_%2B_Data_Structures_%3D_Programs – wilhelmtell

2

अद्वितीय है क्योंकि यह

  • बजाय विशिष्ट अनुप्रयोग समस्याओं के लिए तैयार के लिए उपयोग समाधान प्रदान करने के बुनियादी एल्गोरिदम पर केंद्रित है।
  • उन एल्गोरिदम को लागू करने के लिए अद्वितीय सी ++ सुविधाओं का उपयोग करता है।

सबसे अच्छा होने के लिए के रूप में ... एक कारण है कि एक ही दृष्टिकोण नहीं था (और शायद नहीं होगा) कभी किसी भी अन्य भाषा के द्वारा, डी

तरह प्रत्यक्ष सन्तान
+3

_ "एक कारण है कि एक ही दृष्टिकोण (और शायद नहीं) कभी भी किसी भी अन्य भाषा के बाद नहीं था, जिसमें प्रत्यक्ष वंशज जैसे डी ।"_ - क्या आप कृपया उन कारणों को विस्तारित करेंगे? – missingfaktor

+0

हां, कृपया .... –

+1

क्योंकि डी के डिजाइनर टेम्पलेट्स के साथ ओओ अवधारणाओं को अनुकरण करने से बेहतर जानते हैं? (यह जानना आसान है कि अगर आप कार्य को हल करते हैं तो क्या गलत हो रहा है 'टी' के बजाय 'RandomAccessIterator' की आवश्यकता है) – KitsuneYMG

2

मानक सहित पीछा नहीं है सी ++ लाइब्रेरी के पुनरावृत्तियों के माध्यम से संग्रह के दृष्टिकोण हाल ही में कुछ रचनात्मक आलोचना के लिए आया है। एक उल्लेखनीय सी ++ विशेषज्ञ आंद्रेई अलेक्जेंड्रेसकू ने हाल ही में डी, और describes his experiences designing collections support for it in this article नामक एक भाषा के एक नए संस्करण पर काम करना शुरू कर दिया है।

व्यक्तिगत रूप से मुझे यह निराशाजनक लगता है कि इस तरह के उत्कृष्ट काम को एक और प्रोग्रामिंग भाषा में रखा जा रहा है जो मौजूदा भाषाओं के साथ बड़े पैमाने पर ओवरलैप करता है, और मैंने उसे ऐसा बताया है! :) मैं अपनी विशेषज्ञता के किसी व्यक्ति को तथाकथित "आधुनिक भाषाओं" के लिए संग्रह पुस्तकालय बनाने के लिए अपना हाथ बदलना चाहता हूं जो कि पहले से व्यापक रूप से व्यापक रूप से उपयोग में है, जावा और सी #, जिसमें वह सभी क्षमताओं की आवश्यकता है जो उन्हें लगता है विश्व स्तरीय: आगे की पुनरावृत्ति रेंज की धारणा पहले से ही सर्वव्यापी है, लेकिन एक कुशल तरीके से सामने आने वाले रिवर्स पुनरावृत्ति के बारे में क्या है? उत्परिवर्तनीय संग्रह के बारे में क्या? लिंक के साथ आसानी से यह सब एकीकृत करने के बारे में क्या? आदि

वैसे भी, यह मुद्दा है: किसी को भी विश्वास न करें जो आपको बताता है कि मानक सी ++ रास्ता पवित्र अंगूर है, संभवतः यह संभवतः सबसे अच्छा हो सकता है। यह कई लोगों के बीच एकमात्र तरीका है, और कम से कम एक स्पष्ट दोष है: तथ्य यह है कि सभी मानक एल्गोरिदम में, संग्रह दो अलग इटरेटर्स (प्रारंभ और अंत) द्वारा निर्दिष्ट किया जाता है और इसलिए संचालन लिखने के लिए बेकार है।

+1

कि "बेकार" तरीका आपको सी ++ संग्रहों पर काम करने वाले एल्गोरिदम को अधिक सामान्य बनाने में सक्षम बनाता है, इसलिए वे संग्रहों के विभाजन पर भी काम करते हैं, न केवल पूरे संग्रह। – smerlin

+1

हाँ, यह एक बेकार लेकिन शक्तिशाली संकेत है। मुझे लगता है कि अलेक्जेंड्रेस्कु पूरी तरह से श्रेणियों के साथ इटरेटर्स को बदलकर थोड़ा सा ओवरबोर्ड चला गया है, लेकिन वह स्पष्ट रूप से कुछ पर है। अधिकांश (लेकिन सभी नहीं) मामलों में, इटरेटर्स हमें एक वाक्यविन्यास देते हैं जहां संचालन लिखना बहुत कठिन होता है। – jalf

+0

@ स्मरलिन - एक ऐसी कक्षा पर विचार करें जो रेंज अवधारणा को किसी अन्य श्रेणी में प्रतिनिधि द्वारा लागू करता है जिससे यह उप-श्रेणी को बाहर कर देता है। जैसे एक रेंज 'आर' दिया गया है, अभिव्यक्ति 'स्लाइस (आर, 3, 4)' एक ऑब्जेक्ट लौटाएगी जिसमें निम्न तत्व शामिल हैं: 'आर [3], आर [4], आर [5], आर [6] ] '। तो 'टुकड़ा (आर, 3, 4) [2] = "नमस्ते"; '' [5] = "हाय" के बराबर होगा; इसलिए संग्रहों के समर्थन विभाजन को बहुत सुंदरता से समझा जाता है - इटरेटर से भी ज्यादा। –

13

एसटीएल अंतर्निहित प्रकारों के साथ खूबसूरती से काम करता है। एक std::array<int, 5> बिल्कुल ठीक है - 5 int एस की एक सरणी, जो 32 बिट प्लेटफ़ॉर्म पर 20 बाइट्स का उपभोग करती है।

java.util.Arrays.asList(1, 2, 3, 4, 5), दूसरे हाथ पर, एक वस्तु एक सरणी int रों युक्त पूर्णांक वस्तुओं के संदर्भों वाले के लिए एक संदर्भ से युक्त के लिए एक संदर्भ देता है।हां, यह संकेत के 3 स्तर हैं, और मुझे भविष्यवाणी करने की हिम्मत नहीं है कि कितने बाइट्स खपत करते हैं;)

+2

"मुझे भविष्यवाणी करने की हिम्मत नहीं है कि कितने बाइट्स खपत करते हैं" - आप भविष्यवाणी नहीं कर सकते यह कितने बाइट्स खपत करता है, क्योंकि उदाहरण के लिए आप नहीं जानते कि JVM मुक्केबाजी 'int' के दौरान एक छोटे-पूर्णांक अनुकूलन का उपयोग करने जा रहा है या नहीं, संकेतक का अंतिम स्तर 5 'इंटेगर' ऑब्जेक्ट्स बना सकता है, या 5 स्थिर पूर्णांक का उपयोग कर सकता है वस्तुओं जो हमेशा वहाँ हैं। –

+2

@ स्टेव "आप भविष्यवाणी नहीं कर सकते कि यह कितने बाइट्स खपत करता है" -> मुझे लगता है कि यही कारण है कि मैंने हिम्मत नहीं की ;-) – fredoverflow

+0

'std :: array' अब" एसटीएल "है? आप इसे _really_ खींच रहे हैं! –

7

ध्यान रखें कि एसटीएल अब वास्तव में काफी पुराना है, इसलिए अन्य, नए पुस्तकालयों हो सकता है विशिष्ट फायदे हैं। उम्र को देखते हुए, इसकी लोकप्रियता एक प्रमाण है कि मूल डिजाइन कितना अच्छा था।

चार मुख्य कारण हैं जिनकी वजह मैं कहना चाहता हूँ कि एसटीएल (अभी भी) है भयानक हैं:

स्पीड एसटीएल सी ++ टेम्प्लेट का उपयोग किया, जिसका अर्थ है कि संकलक कोड है कि विशेष रूप से के आपके उपयोग के आधार पर किया जाता है उत्पन्न करता है पुस्तकालय। उदाहरण के लिए, मानचित्र 'कुंजी' प्रकार के 'मानचित्र' प्रकार के मानचित्र संग्रह को लागू करने के लिए स्वचालित रूप से एक नई कक्षा उत्पन्न करेगा। कोई रनटाइम ओवरहेड नहीं है जहां लाइब्रेरी काम करने की कोशिश करती है कि 'कुंजी' और 'मूल्य' को कुशलतापूर्वक कैसे स्टोर किया जाए - यह संकलन समय पर किया जाता है। सुरुचिपूर्ण डिजाइन के कारण कुछ प्रकार के कुछ ऑपरेशन एकल असेंबली निर्देशों (जैसे वृद्धि पूर्णांक-आधारित इटरेटर) तक संकलित हो जाएंगे।

क्षमता संग्रह वर्गों 'allocators' है, जो या तो आप अपने आप को प्रदान करते हैं या पुस्तकालय द्वारा उपलब्ध कराए गए हैं, जो अपने डाटा स्टोर करने के लिए केवल पर्याप्त भंडारण आवंटित उपयोग कर सकते हैं की एक धारणा है। कोई पैडिंग और न ही बर्बाद है। जहां एक अंतर्निर्मित प्रकार को अधिक कुशलता से संग्रहीत किया जा सकता है, इन मामलों को बेहतर तरीके से संभालने के लिए विशेषज्ञताएं हैं, उदा। बूल के वेक्टर को बिटफील्ड के रूप में संभाला जाता है।

Exensibility आप कंटेनर (संग्रह वर्ग) का उपयोग कर सकते, एल्गोरिदम और किसी भी प्रकार के लिए उपयुक्त है कि पर एसटीएल में प्रदान की कार्य। यदि आपके प्रकार की तुलना की जा सकती है, तो आप इसे एक कंटेनर में डाल सकते हैं। यदि यह एक कंटेनर में जाता है, तो इसे सॉर्ट किया जा सकता है, खोजा जा सकता है, तुलना की जा सकती है। आप 'bool विधेय (MyType)' की तरह एक समारोह प्रदान करते हैं, तो यह, फ़िल्टर किया जा सकता आदि

सुंदरता अन्य पुस्तकालयों/चौखटे क्रमबद्ध() लागू करने के लिए/(खोजें)/रिवर्स() पद्धतियों पर है प्रत्येक प्रकार का संग्रह। एसटीएल इन्हें अलग-अलग एल्गोरिदम के रूप में लागू करता है जो के इटरेटर को लेते हैं जो आप का उपयोग कर रहे हैं और उस संग्रह पर अंधेरे से काम करते हैं। एल्गोरिदम परवाह नहीं है कि आप एक वेक्टर, सूची, डेक, स्टैक, बैग, मानचित्र का उपयोग कर रहे हैं - वे बस काम करते हैं।

+1

गति: टेम्पलेट संकलन गति और वर्चुअल पॉइंटर लुकअप को मारते हैं _that_ long नहीं लेते हैं। यह 1 9 70 नहीं है। क्षमता: पहले वेक्टर एक घृणा है जिसे मरने की जरूरत है। आवंटक दक्षता के बारे में नहीं हैं, वे इस बारे में हैं कि एक नया 'टी 'कैसे बनाया और हटा दिया जाता है। एक्सटेंसिबिलिटी: यह एसटीएल के लिए अद्वितीय नहीं है। नरक, मैं जावा में एल्गोरिदम लिखता हूं जो 'Iterator और/या' 'अनुमानित करें। – KitsuneYMG

+2

लालित्य: फिर, यह एसटीएल के लिए अद्वितीय नहीं है। कोई भी सामान्य प्रोग्रामिंग भाषा वैसे ही करता है। ओओ भाषाएं (जावा की तरह) एक सूची प्रकार प्रदान करती है जो एक प्रकार का फ़ंक्शन निर्दिष्ट करती है। यह नहीं कहता कि फ़ंक्शन एक जेनेरिक सॉर्ट एल्गोरिदम को कॉल नहीं कर सकता है। वास्तव में जावा सूची के पास 'सॉर्ट' सदस्य फ़ंक्शन नहीं है, उन्हें 'संग्रह .ॉर्ट', एक स्थैतिक विधि द्वारा क्रमबद्ध किया जाता है। – KitsuneYMG

+3

@kts: अधिकांश सी ++ डेवलपर्स संकलन गति के बारे में ज्यादा परवाह नहीं करते हैं; बल्कि; हम रनटाइम गति की परवाह करते हैं। साथ ही, टेम्पलेट्स केवल धीमे होते हैं यदि आप क्रैपी कंपाइलर का उपयोग करते हैं - किसी भी उचित हालिया कंपाइलर में उनके साथ कोई समस्या नहीं है। क्या यह निर्माण समय पर सी से धीमा होगा? शायद। इसका मतलब यह नहीं है कि सुविधा हटा दी जानी चाहिए। –

0

प्राथमिक बात यह है कि, आप कंटेनर स्विच-इन/स्विच-आउट का उपयोग करने के लिए टेम्पलेट का उपयोग कर सकते हैं, बिना जावा की इंटरफेस की भयानक गड़बड़ी का सहारा लेना।

+2

नहीं आप नहीं कर सकते। कभी-कभी 'प्रभावी एसटीएल' पढ़ें। प्रत्येक कंटेनर वर्तमान में इतना अलग है कि आप एक वेक्टर के लिए एक सूची स्वैप नहीं कर सकते हैं। जावा में आप एक ऐरेलिस्ट के लिए एक लिंक्डलिस्ट को स्वैप कर सकते हैं और इंटरफ़ेस (सूची) अपरिवर्तित है। – KitsuneYMG

+0

इस बात पर निर्भर करता है कि आप किस स्तर का उपयोग करने की कोशिश कर रहे हैं। मैं बस वेक्टर और वेक्टर का उपयोग कर रहा था। – Puppy

3

एसटीएल आपको टुकड़े देता है।

भाषाएं और उनके वातावरण छोटे घटक टुकड़ों से बने होते हैं, कभी-कभी प्रोग्रामिंग भाषा संरचनाओं के माध्यम से, कभी-कभी कट-एंड-पेस्ट के माध्यम से। उदाहरण के लिए, कुछ भाषाएं आपको एक सीलबंद बॉक्स देती हैं - जावा के संग्रह। आप जो भी कर सकते हैं वह कर सकते हैं, लेकिन अगर आप उनके साथ कुछ विदेशी करना चाहते हैं तो आपको परेशान कर सकते हैं।

एसटीएल आपको उन टुकड़ों को देता है जो डिजाइनर अपनी उन्नत कार्यक्षमता का निर्माण करते थे। सीधे इटरेटर्स, एल्गोरिदम इत्यादि का पर्दाफाश करना आपको अपनी समस्या को हल करने के लिए उपयुक्त तरीके से कोर डेटा संरचनाओं और जोड़-विमर्शों को पुन: संयोजित करने का एक सार है लेकिन अत्यधिक लचीला तरीका प्रदान करता है। जबकि जावा के डिज़ाइन शायद डेटा संरचनाओं से आपको जो चाहिए, उसके लिए 90-95% अंक हिट करता है, एसटीएल की लचीलापन इसे 99% तक बढ़ा देती है, इटरेटर अबास्ट्रक्शन का अर्थ है कि आप शेष 1% के लिए पूरी तरह से अपने आप नहीं हैं।

जब आप गठबंधन है कि अपनी गति और अन्य तानाना और customizabiltiy विशेषताएं (allocators, लक्षण, आदि) के साथ, आप एक काफी उत्कृष्ट पैकेज है। मुझे नहीं पता कि मैं इसे सबसे अच्छा डेटा संरचना पैकेज कहूंगा, लेकिन निश्चित रूप से एक बहुत अच्छा है।

चेतावनी: प्रतिशत पूरी तरह से बना हुआ है।

+0

यह किसी भी अन्य संग्रह पुस्तकालय से अलग कैसे है? –

+0

@ बिली समग्र एल्गोरिदम और इटरेटर आपको छोटे टुकड़ों से चीजों को बनाने देते हैं। बाइनरी सर्च लें: जावा आपको एक बाइनरी सर्च देता है जो एक मेल खाने वाला आइटम पाता है। क्या होगा अगर कई मिलान आइटम हैं? सी ++ दो विधियों, निचले_बाउंड और ऊपरी_बाउंड देता है, जो मिलान करने वाली वस्तुओं की एक समान श्रृंखला के निचले और ऊपरी बाउंडिंग इटरेटर्स को पाता है। यदि आपको एकाधिक वस्तुओं के किनारे के मामले की आवश्यकता है, तो जावा आपको लगभग लटकता है। –

2

जाहिर सी ++, C# और जावा के रूप में आप उन्हें करना चाहते हैं के रूप में कई pissing प्रतियोगिता में प्रवेश कर सकते हैं। इस बात का संकेत है कि एसटीएल कम से कम कुछ हद तक महान क्यों है कि जावा प्रारंभ में डिज़ाइन और सुरक्षित प्रकार के कंटेनर के बिना कार्यान्वित किया गया था। फिर सूर्य ने फैसला किया/महसूस किया कि लोगों को वास्तव में उन्हें टाइप की गई भाषा में चाहिए, और 1.5 में जेनेरिक जोड़ा।

आप पेशेवरों और प्रत्येक के विपक्ष तुलना कर सकते हैं, लेकिन के रूप में तीन भाषाओं के सामान्य कंटेनरों के "सबसे बड़ी" कार्यान्वयन है जो करने के लिए - कि केवल एक pissing प्रतियोगिता है। क्या के लिए सबसे बढ़िया? किसकी राय में? उनमें से प्रत्येक में सर्वश्रेष्ठ पुस्तकालय हैं जो रचनाकारों ने भाषाओं द्वारा लगाए गए अन्य बाधाओं के अधीन आने में कामयाब रहे। जेनिक्स के सी ++ का विचार जावा में काम नहीं करता है, और विशिष्ट सी ++ उपयोग में टाइप एरर उप-मानक होगा।

0

आप क्या उपयोग एसटीएल को देखने के लिए विफल रहते हैं, मैं एक किताब, "सी ++ प्रोग्रामिंग भाषा" Bjarne Stroustrup द्वारा खरीदने की सलाह देते हैं। यह सी ++ के बारे में सबकुछ बताता है क्योंकि वह दोस्त है जिसने इसे बनाया है।

+0

मुझे पूरा यकीन है कि समिति ने अपनी भाषा में क्या किया है, इसके लिए दोस्त को गुप्त रूप से रोना चाहिए। – Zygrob

+0

@ ज़ीगोब: शायद, लेकिन ऐसा नहीं है कि कोई आवाज़ नहीं है: वह समिति _on_ है। –

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