2009-08-28 14 views
28

पहले, मैं एमएफसी संग्रह कक्षाओं जैसे CArray और CMap का उपयोग करता था। थोड़ी देर बाद मैंने एसटीएल कंटेनर में स्विच किया और थोड़ी देर के लिए उनका इस्तेमाल कर रहा हूं। हालांकि मुझे एसटीएल बहुत बेहतर लगता है, मैं इसके लिए सटीक कारणों को इंगित करने में असमर्थ हूं। तर्क से कुछ जैसे:क्यों एमएफसी कंटेनरों पर एसटीएल कंटेनरों को प्राथमिकता दी जाती है?

  1. यह MFC की आवश्यकता है: नहीं रखता है क्योंकि मेरे कार्यक्रम के अन्य भागों MFC का उपयोग करता
  2. यह मंच निर्भर है:। क्योंकि मैं केवल खिड़कियों पर अपने आवेदन को चलाने के नहीं रखता है (कोई पोर्टेबिलिटी के लिए की जरूरत है)
  3. यह सी ++ मानक में परिभाषित किया गया है: ठीक है, लेकिन MFC कंटेनर अभी भी काम

एकमात्र कारण मैं ऊपर आ सकता है कि मैं कंटेनरों पर एल्गोरिदम का उपयोग कर सकते हैं। क्या कोई अन्य कारण है कि मैं यहां याद कर रहा हूं - एमएफसी कंटेनर की तुलना में एसटीएल कंटेनर बेहतर क्या बनाता है?

+1

आप इस प्रश्न के शीर्षक में जोड़ना चाहते हैं कि पोर्टेबिलिटी चिंता का विषय नहीं है। अकेले शीर्षक अभी आपकी कुछ आवश्यकताओं को कैप्चर नहीं करता है। –

+0

एसटीएल निश्चित रूप से सभी उत्तर राज्य के रूप में बेहतर है, लेकिन वास्तव में मुझे क्या बंद कर देता है यह है कि एमएफसी कंटेनर का उपयोग कर पीपीएल लेखन अभी भी है। माना जाता है कि वे ज्यादातर टेम्पलेट कंटेनर का उपयोग कर रहे हैं, लेकिन दोनों के बीच स्थानांतरित करना अपर्याप्त है। क्यों एमएस या तो उन्हें बहिष्कृत नहीं करता है या उन्हें इटरेटर जोड़ता है, बस वे सभी को बंद करने वाली बाड़ पर बैठे हैं। – Adrian

+0

@ एड्रियन क्योंकि हम में से कुछ को विरासत कोड का उपयोग करना चाहिए, लेकिन नवीनतम उपकरण चाहते हैं। पुरानी चीजों के लिए समर्थन प्रदान करना, लेकिन नई चीजों को प्रोत्साहित करना दोनों दुनिया के सर्वश्रेष्ठ हैं। मेरा विश्वास करो, अगर एमएस ने पुराने कंटेनरों को हटा दिया तो यह मुझे और अधिक दूर कर देगा। इस तथ्य पर विचार करें कि यदि आप एमएफसी का उपयोग कर रहे हैं, तो आप शायद पहली जगह "विरासत" -श ऐप से निपट रहे हैं। :- डी – franji1

उत्तर

44

रोनाल्ड Laeremans, कुलपति ++ उत्पाद यूनिट प्रबंधक, यहां तक ​​कि said to use STL जून 2006 में:

और स्पष्ट रूप से टीम आप एक ही जवाब दे देंगे। एमएफसी संग्रह कक्षाएं पीछे की संगतता के लिए केवल वहां हैं। सी ++ में संग्रह कक्षाओं के लिए मानक है और यह मानक सी ++ लाइब्रेरी है। एमएफसी आवेदन में किसी भी मानक पुस्तकालय का उपयोग करने के लिए कोई तकनीकी कमी नहीं है।

हम इस क्षेत्र में महत्वपूर्ण बदलाव करने की योजना नहीं बनाते हैं।

रोनाल्ड Laeremans
कार्यवाहक उत्पाद यूनिट प्रबंधक
विजुअल C++ टीम

हालांकि, एक बिंदु है जहां मैं कुछ कोड है कि Windows की स्थापना के चरण के दौरान भाग गया पर काम कर रहा था पर, मैं एसटीएल कंटेनरों का उपयोग करने की अनुमति नहीं थी , लेकिन इसके बजाय एटीएल कंटेनर का उपयोग करने के लिए कहा गया था (वास्तव में CString विशेष रूप से, जो मुझे लगता है कि वास्तव में एक कंटेनर नहीं है)। स्पष्टीकरण यह था कि एसटीएल कंटेनरों की रनटाइम बिट्स पर निर्भरता थी जो कोड को निष्पादित करने के समय वास्तव में उपलब्ध नहीं हो सकती थी, जबकि उन समस्याओं को एटीएल संग्रहों के लिए मौजूद नहीं था। यह एक विशेष परिदृश्य है जो वहां 99% कोड को प्रभावित नहीं करना चाहिए।

+7

'सीएसटींग' वास्तव में एक कंटेनर नहीं है (एक बहुत तकनीकी समझ को छोड़कर), और इसमें बहुत सी सुविधा सुविधाएं हैं जो Win32 और COM API से बहुत अधिक व्यवहार करते समय उपयोग करने के लिए अधिक उपयुक्त बनाती हैं। –

+3

* "स्पष्टीकरण यह था कि एसटीएल कंटेनरों की रनटाइम बिट्स पर निर्भरता थी जो कोड को निष्पादित करने के समय वास्तव में उपलब्ध नहीं हो सकता था" * ... अब मैं * कंटेनर * का * भाग देखना चाहता हूं * एसटीएल में कोड। अनुमोदित, मुझे उन सभी डीबग चेकों के बारे में निश्चित नहीं है जो वैकल्पिक रूप से उपलब्ध हैं, लेकिन एक सादे रिलीज बिल्ड के लिए मैं कहूंगा कि सभी एसटीएल संग्रह शुद्ध हेडर-केवल नो-रनटाइम-बिट्स-शामिल हैं। (सी ++ एसटीडीआईएलबी एमएसवीसीपी * की त्वरित जांच * डीएलएल ने किसी भी कंटेनर से संबंधित निर्यात को चालू नहीं किया है।) –

+0

@ मार्टिनबा: मैं अनुमान लगाता हूं कि यह सूक्ष्म है: शायद विवरण के अंदर 'std :: allocator :: आवंटित 'लागू किया गया है, अपवाद वर्ग, और इसी तरह। –

3

वास्तव में you can use STL algorithms on some of MFC containers as well। हालांकि, एसटीएल कंटेनरों को एक और बहुत व्यावहारिक कारण के लिए प्राथमिकता दी जाती है: कई तृतीय पक्ष पुस्तकालय (बूस्ट, अरबीका, क्रिप्टो ++, यूटीएफ-सीपीपी ...) को एसटीएल के साथ काम करने के लिए डिज़ाइन किया गया है, लेकिन एमएफसी कंटेनर के बारे में कुछ भी नहीं पता है।

1

यह वह काम है जो आप जो काम करना चाहते हैं उसके लिए काम करते हैं, और 'बेहतर' एक व्यक्तिपरक शब्द है।

यदि आपको अपने कंटेनरों को अन्य मानकों-अनुरूप कोड के साथ उपयोग करने की आवश्यकता है, या यदि यह कभी भी प्लेटफॉर्म पर साझा किया जाने वाला कोड होने जा रहा है, तो एसटीएल कंटेनर शायद बेहतर शर्त हैं।

यदि आप निश्चित हैं कि आपका कोड एमएफसी-भूमि में रहेगा, और एमएफसी कंटेनर आपके लिए काम करते हैं, तो उनका उपयोग क्यों न करें?

एसटीएल कंटेनर एमएफसी कंटेनर से स्वाभाविक रूप से बेहतर नहीं हैं, हालांकि वे मानक का हिस्सा हैं, वे संदर्भों की एक विस्तृत श्रृंखला में अधिक उपयोगी हैं।

+2

मेरे वाहक में एक से अधिक बार मैंने सुना है कि "कभी पोर्ट नहीं किया जा रहा है" और यह कथन मोटे तौर पर गलत हो रहा है। – sbi

33

एसटीएल कंटेनर:

  • प्रदर्शन की गारंटी देता है
  • एसटीएल एल्गोरिदम में इस्तेमाल किया जा सकता है जो भी प्रदर्शन की गारंटी देता है
  • तीसरे पक्ष के सी ++ बूस्ट तरह पुस्तकालयों
  • हैं द्वारा उपयोग किया जा सकता है मानक, और स्वामित्व समाधान
  • एल्गोरिदम और डेटा संरचनाओं के सामान्य प्रोग्रामिंग को प्रोत्साहित करने की संभावना है। यदि आप एसटीएल के अनुरूप नए एल्गोरिदम और डेटा संरचनाएं लिखते हैं तो आप लाभ उठा सकते हैं कि एसटीएल पहले से ही बिना किसी कीमत पर प्रदान करता है। में वाक्य रचना, अंतर, और प्रतिमान (जैसे बढ़ावा के रूप में) अन्य पुस्तकालयों के साथ
21
  • संगतता। यह एक गैर-तुच्छ लाभ है।
  • एसटीएल का उपयोग करना एक कौशल विकसित करेगा जो अन्य संदर्भों में उपयोगी होने की संभावना है। एमएफसी इतनी व्यापक रूप से उपयोग नहीं किया जाता है; एसटीएल है।
  • एसटीएल का उपयोग करने से एक मानसिकता विकसित होगी जो आप स्वयं लिखने वाले कोड में उपयोगी (या नहीं) पा सकते हैं।

एसटीएल के अलावा कुछ और उपयोग करना स्वाभाविक रूप से गलत नहीं है।

2

मुझे लगता है कि यह एक साधारण प्रश्न के लिए उबालता है: आप किस पर भरोसा करते हैं? यदि आप माइक्रोसॉफ्ट पर भरोसा करते हैं, तो एमएफसी वेरिएंट का उपयोग करना जारी रखें। यदि आप उद्योग पर भरोसा करते हैं, तो एसटीएल का उपयोग करें।

मैं एसटीएल के लिए वोट देता हूं क्योंकि आज विंडोज़ पर चलने वाले कोड को किसी अन्य प्लेटफ़ॉर्म पर पोर्ट करने की आवश्यकता हो सकती है। :)

+1

सामान्य रूप से एक मान्य बिंदु, लेकिन इस विशेष मामले में नहीं: वह एमएफसी का उपयोग किसी भी जगह पर कर रहा है, और एसटीएल के साथ एमएफसी कंटेनर को बदलने से उसके आवेदन की पोर्टेबिलिटी में बहुत कम योगदान होगा। –

+5

माइक्रोसॉफ्ट अपने स्वयं के कंपाइलर पर एमएफसी और एसटीएल दोनों के लिए ज़िम्मेदार है, इसलिए यह एक गैर-तर्क है। मुझे कभी भी अलग-अलग प्रतिमानों की विश्वसनीयता नहीं मिली है। –

+0

अच्छा बिंदु। हालांकि आप हमेशा किसी तृतीय-पक्ष लाइब्रेरी का उपयोग कर सकते हैं। –

5

मैं हमेशा अधिक मानक/संगत पुस्तकालयों का उपयोग करना पसंद करता हूं, जहां से मैं भविष्य की परियोजनाएं कर सकता हूं क्योंकि मैं कोड के एक हिस्से का पुन: उपयोग कर सकता हूं। मुझे नहीं पता कि पुस्तकालय भविष्य की परियोजनाओं का उपयोग किस प्रकार करेंगे, लेकिन अगर मैं मानक/संगत सामान का उपयोग करता हूं तो मेरे कोड को पुन: प्रयोज्य बनाने का एक बेहतर मौका है।

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

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

6
  • एसटीएल MFC
  • की तुलना में अधिक संग्रह प्रकार
  • दृश्य स्टूडियो (2008 +) डिबगर एसटीएल ज्यादा MFC की तुलना में बेहतर की परिकल्पना करती है। (AUTOEXP.DAT जादू है कि ठीक कर सकते हैं - लेकिन यह एक दर्द अपने डिबगर डिबगिंग जब आप इसे पेंच अप जैसा कुछ भी नहीं है ...)

MFC के साथ एक अच्छी बात अभी भी का विशाल संग्रह है कि वहाँ है वहाँ एमएफसी कोड। अन्य उत्तर तीसरे पक्ष की संगतता के बारे में बात करते हैं। तीसरे पक्ष के एमएफसी आधारित सामान मत भूलना।

+1

हां, जब मैं एसटीएल की बात करता हूं तो मुझे बस वीएस -2008 डीबगर से प्यार है। पहले मैं वीसी 6 का उपयोग कर रहा था और वीएस -2008 में परिवर्तन ने मेरी जिंदगी को इतना आसान बना दिया है। – Naveen

+1

मैंने हाल ही में autoexp.dat में एक जोड़ा पोस्ट किया है जो केवल यह प्राप्त करता है: http://thetweaker.wordpress.com/2010/01/11/visualizing-mfc-containers-in-autoexp-dat/ –

3

एमएफसी कंटेनर CObject और CObject से प्राप्त हुए हैं असाइनमेंट ऑपरेटर निजी बना दिया है। मुझे अभ्यास में यह बहुत परेशान पाया गया है।

std::vector, CArray unlinke, गारंटी देता है कि स्मृति ब्लॉक सटा हुआ है, इस प्रकार आप आसानी से सी प्रोग्रामिंग इंटरफेस के साथ Interop कर सकते हैं:

std::vector<char> buffer; 
char* c_buffer = &*buffer.begin(); 
+0

CArray संगत स्मृति की गारंटी देता है : "स्मृति को ऊपरी बाउंड में आवंटित किया जाता है, भले ही कुछ तत्व शून्य हों।" http://msdn.microsoft.com/en-us/library/4h2f09ct.aspx –

1

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

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

1

उल्लिखित पहलुओं के आगे: अच्छी तरह से समर्थित, मानक उपलब्ध, प्रदर्शन के लिए अनुकूलित, एल्गोरिदम के साथ उपयोग के लिए डिज़ाइन किया गया, मैं एक और पहलू जोड़ सकता हूं: टाइप-सुरक्षा, और संकलन-समय जांच का भार। आप std::set<int> में से double ड्राइंग की कल्पना भी नहीं कर सकते हैं।

1

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

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

3

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

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

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