दृश्य C++ 2008, नहीं, इस के रूप में "सुरुचिपूर्ण" के रूप में यह हो जाता है के बारे में है। मानक लाइब्रेरी एल्गोरिदम प्रदान करती है जिसका उपयोग कंटेनरों में हेरफेर करने के लिए किया जा सकता है, लेकिन ज्यादातर परिदृश्यों में - विशेष रूप से इस तरह के सरल उपयोग मामलों में - वे उपयोग करने के लिए बहुत बोझिल हैं।
सी ++ 11 सी ++ में लैम्ब्डा अभिव्यक्ति जोड़ता है। विजुअल सी ++ 2010 और अन्य सी ++ कंपाइलर्स के हाल के संस्करण इस सी ++ 11 फीचर का समर्थन करते हैं। लैम्ब्डा भाव के साथ, आप आसानी से अपने कार्य के लिए transform
एल्गोरिथ्म का उपयोग कर सकते हैं:
std::transform(v1.begin(), v1.end(), std::back_inserter(v2),
[](Foo const& x) { return x.b; });
लैम्ब्डा भाव के बिना, आप struct से b
तत्व को निकालने के लिए एक समारोह को परिभाषित करना होगा:
long get_b(Foo const& x) { return x.b; }
इसके बाद आप transform
एल्गोरिथ्म के साथ इस समारोह का उपयोग कर सकता:
std::transform(v1.begin(), v1.end(), std::back_inserter(v2), get_b);
हालांकि, इस तरह सरल उपयोग के मामलों के लिए, इस qu कर सकते हैं अजीब कोड को अजीब तरह से ले जाता है क्योंकि सभी संबंधित कार्यों को अच्छी तरह से रखना मुश्किल है।
स्रोत
2012-03-29 21:12:54
और, ज़ाहिर है, बूस्ट.लैम्ब्डा जैसी अन्य तकनीकें हैं, या सामान्य उद्देश्य ट्रांसफॉर्मर लिख रही हैं और मानक लाइब्रेरी बाइंडर्स के साथ उनका उपयोग कर रही हैं, लेकिन इन तकनीकों में से कोई भी मूल कोड में क्या नहीं है । –
मुझे लगता है कि हस्ताक्षर 'लंबा और (फू एंड)' का एक कार्य प्राप्त करने के लिए आप 'std :: bind (& foo :: b)' का उपयोग भी कर सकते हैं। –
मैंने अपनी याददाश्त से 'बांध' को पूरी तरह से अवरुद्ध करने की कोशिश की है, हालांकि मुझे डर है कि कुछ निशान हमेशा के लिए बने रहेंगे। : -ओ –