2010-03-08 10 views
6

मैं एमएस वीसी 2008 का उपयोग कर रहा हूं और कुछ परियोजनाओं के लिए इंटेल सी ++ कंपाइलर 11.0। क्या उत्पादन में टी 1 सुविधाओं का उपयोग करना उचित है? क्या वे नए मानक में रहेंगे?क्या यह उत्पादन में std :: tr1 का उपयोग करने लायक है?

उदाहरण के लिए, अब मैं stdext::hash_map का उपयोग करता हूं। टीआर 1 std::tr1::unordered_map परिभाषित करता है। लेकिन एमएस कार्यान्वयन में unordered_map सिर्फ उनका stdext::hash_map है, जो किसी अन्य तरीके से templatized है।

उत्तर

6

मेरी सलाह आपके द्वारा उपयोग किए जाने वाले TR1 आइटम वाले नामस्थान के लिए उपनाम का उपयोग करना होगा। इस तरह, जब आप अपने कंपाइलर का समर्थन करते हैं तो आप TR1 संस्करण को मानक संस्करण में उपयोग करने से "स्थानांतरित" करने में सक्षम होंगे।

namespace cpp0x = std::tr1; 

cpp0x::unordered_map<std::string, int> mymap; 

एक C++ 0x संकलक के लिए, पहली पंक्ति हो जाता है:

namespace cpp0x = std; 

और आप आराम अकेला छोड़ सकते हैं।

9

हां, tr1 में जो कुछ भी है, वह वहां रहेगा। कुछ चीजें std :: में स्वीकार की जाएंगी, लेकिन वे tr1 में भी रहेंगे। इसलिए नया कोड समाप्त होने के बाद आपका कोई भी कोड टूट जाएगा।

मुझे माफ़ कर दो: नहीं, वे नहीं करेंगे। बताया गया है here:

दो सूचनाएं प्रस्ताव में जोड़ा गया है उपयोगकर्ताओं को शायद यह है कि भविष्य मानकों के टी.आर. से संक्रमण में, टी.आर. घटकों नाम स्थान std :: tr1 और विन्यास में नहीं रहेगी बनाने के लिए मैक्रोज गायब हो जाएगा।

लेकिन यह देखते हुए कि संकलक विक्रेताओं अब tr1 का समर्थन करने के लिए तैयार के लायक है, संभवत: अपने पैरों के नीचे से धरती खींच नहीं होगा, और संक्रमण विधि के कुछ प्रकार प्रदान करते हैं।

1

tr1::unordered_map के लिए जागरूक रहें कि हैश मैप्स के कई विभिन्न कार्यान्वयन संभव हैं और मानक द्वारा निर्वाचित कार्यान्वयन काफी क्लासिक है ... लेकिन आपके विशेष कार्य के लिए सबसे अधिक प्रदर्शन नहीं हो सकता है।

दुर्भाग्य से मानक की आवश्यकता नहीं थी कि कई रणनीतियों को लागू किया जाए (हालांकि मुझे लगता है कि इसे काफी काम की आवश्यकता होगी)।

+1

मैं मानक द्वारा चुने गए कार्यान्वयन के द्वारा आपका क्या मतलब है इस पर स्पष्ट नहीं हूं। मानक ओ() व्यवहार, कार्यान्वयन नहीं निर्धारित करता है।क्या एस() व्यवहार का एक अलग सेट है जो आप सहयोगी कंटेनरों में चाहते हैं? –

+1

'ओ()' हमेशा सार्थक नहीं है। उदाहरण के लिए, रीहशिंग की अवधि में। सभी हैशैप्स ने निरंतर सम्मिलन को कम किया है, फिर भी यदि आपके पास गतिशील रीहैशिंग नहीं है, तो कुछ प्रविष्टियां बहुत धीमी हो जाएंगी (जैसे कि जब आप 'std :: vector :: push_back' पर रीयलोक ट्रिगर करते हैं)। 'ओ (1)' यहां कुछ छूट देता है और यदि आपको एक महत्वपूर्ण प्रक्रिया पर लगातार सम्मिलन करने की आवश्यकता है, तो यह पर्याप्त नहीं है। –

5

unordered_map नए मानक में होगा, hash_map नहीं होगा। ध्यान दें कि tr1 नेमस्पेस मानक भी नहीं है।

+0

मुझे नहीं पता था कि std :: tr1 मानक नहीं था। मेरे पास अंतिम tr1 मानक नहीं है, लेकिन जिस ड्राफ्ट को मैं देख रहा हूं (पीडीएफ लिंक) कहता है, "चूंकि इस तकनीकी रिपोर्ट में वर्णित एक्सटेंशन C++ मानक लाइब्रेरी का हिस्सा नहीं हैं, इसलिए उन्हें सीधे नामस्थान के भीतर घोषित नहीं किया जाना चाहिए std। अन्यथा निर्दिष्ट किए जाने तक, इस तकनीकी रिपोर्ट में वर्णित सभी घटकों को नामस्थान std :: tr1 में घोषित किया गया है। " http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf – Ben

+0

@ बेन टीआर 1 सी ++ के लिए मानक नहीं है। –

2

लाइब्रेरी कोड का विशाल बहुमत सी ++ 0x में जोड़ा जाएगा Boost C++ Libraries में काफी समय से रहा है। मैं बूस्ट (यानी boost::unordered_map) का उपयोग करने की दृढ़ता से अनुशंसा करता हूं, क्योंकि यह बहुत बड़ी संख्या में आईएसओ सी ++ 1998 कंपाइलर्स पर काम करता है, और सी ++ 0x कंपाइलर्स पर काम करना जारी रखेगा (शायद कंपाइलर के बिल्टिन कार्यान्वयन का उपयोग करना)। इसके अलावा, आपको नेमस्पेस को बदलने की आवश्यकता नहीं होगी - जबकि अनुमोदित std :: tr1 में आइटम std में स्थानांतरित हो जाएंगे - क्योंकि यह हमेशा boost :: में उपलब्ध होगा, और आपको चिंता करने की आवश्यकता नहीं होगी टीआर 1 के किस तत्व ने इसे मानक में बनाया है। संक्षेप में, बूस्ट जाने का रास्ता है।

+1

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

+0

@the_mandrill, मुझे पूरा यकीन है कि बूस्ट अंतर्निहित मानक कार्यान्वयन का उपयोग करेगा यदि यह उपलब्ध है ... क्या आपके पास कोई बेंचमार्क है जो इंगित करता है कि बूस्ट संस्करण धीमा है जहां मानक संस्करण उपलब्ध है? यदि हां, तो किस मंच पर और बूस्ट के किस संस्करण के साथ? –

+0

मुझे किसी भी मानक के बारे में पता नहीं है, लेकिन मुझे वीएस.Net में से एक के साथ shared_ptr के बूस्ट संस्करण की तुलना करना याद है और बूस्ट एक और अधिक हेवीवेट दिखाई देता है, क्योंकि यह कई और फाइलों में खींचता है और उसे संख्या में कर्कश काम करना पड़ता है कंपाइलर्स के। इस बीच VS.Net स्थानीय कंपाइलर की ओर अनुकूलित करने के लिए स्वतंत्र है। मैंने कभी भी बूस्ट कार्यान्वयन को स्थानीय संस्करणों का उपयोग नहीं देखा है। –

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