मैं कोड std::for_each
, bind
के साथ बहुत सारे उपयोग कर रहा हूं, और इसी तरह, लेकिन मैंने देखा कि कभी-कभी STL
उपयोग अच्छा विचार नहीं है। थोड़ी देर के लिए,एसटीएल का कितना अधिक है?
std::for_each(vec.begin(), vec.end(), Foo())
और यह खूबसूरत है और ठीक:
उदाहरण के लिए यदि आप एक std::vector
है और वेक्टर के प्रत्येक आइटम पर एक कार्रवाई करना चाहते हैं, अपना पहला विचार यह उपयोग करने के लिए है। लेकिन फिर बग रिपोर्ट का पहला सेट आता है और आपको कोड को संशोधित करना होगा। अब आप Foo()
कॉल करने के लिए पैरामीटर जोड़ना होगा, इसलिए अब यह हो जाता है:
std::for_each(vec.begin(), vec.end(), std::bind2nd(Foo(), X))
लेकिन यह है कि केवल अस्थायी समाधान है। अब परियोजना परिपक्व हो रही है और आप व्यवसाय तर्क को बेहतर समझते हैं और आप कोड में नए संशोधन जोड़ना चाहते हैं। यह इस बिंदु पर है कि आपको एहसास है कि आपको पुराने अच्छे का उपयोग करना चाहिए:
for(std::vector::iterator it = vec.begin(); it != vec.end(); ++it)
क्या यह केवल मेरे लिए हो रहा है? क्या आप अपने कोड में इस तरह के पैटर्न को पहचानते हैं? क्या आपने STL
का उपयोग करके समान एंटी-पैटर्न का अनुभव किया है?
बीटीडब्ल्यू, यदि आपके दूसरे उदाहरण में, "एक्स" सभी तत्वों के लिए समान है। बस इसे फू के कन्स्ट्रक्टर को पास करें और इसे बाध्य करने के बजाए इसे मजेदार में स्टोर करें। बहुत आसान –
आप वास्तव में एसटीएल का उपयोग नहीं कर रहे हैं, इसलिए आप सुरक्षित हैं :) –
बस एक राय है, लेकिन "बहुत अधिक" तब होती है जब आप उन सुविधाओं का उपयोग करते हैं जिन्हें आपको पूरी तरह से उपयोग करने के लिए आवश्यकता नहीं होती है। यदि यह सहायक है, तो इसका इस्तेमाल करें। यदि आप अत्यधिक लंबे नामों के बारे में चिंतित हैं, तो आप हमेशा उन्हें टाइप करने के लिए टाइपिफ़ या नेमस्पेस उपनाम का उपयोग कर सकते हैं (उदाहरण के लिए, 'typedef std :: vector :: iterator VecIter; ')। मानक लाइब्रेरी के साथ बात यह है कि यह आमतौर पर किसी दिए गए कंपाइलर पर कुछ करने का सबसे सामान्य सामान्य मामला तरीका है, क्योंकि केवल कंपाइलर के निर्माता या जो लोग इसे सर्वश्रेष्ठ जानते हैं (यदि निर्माता नहीं हैं) इसके कार्यान्वयन को लिखेंगे। उपयोगी होने पर इसका उपयोग करने से डरो मत। –