हमेशा उस वैरिएंट का उपयोग करें जो सबसे अच्छा वर्णन करता है कि आप क्या करने का इरादा रखते हैं। अर्थात्
प्रत्येक तत्व के लिए x
में vec
, कर bar.process(x)
।
अब, उदाहरणों की जांच करते हैं:
std::for_each(vec.begin(), vec.end(),
std::bind1st(std::mem_fun_ref(&Bar::process), bar));
हमारे पास for_each
वहाँ भी है - यिप्पीह । हमारे पास वह [begin; end)
सीमा है जिस पर हम काम करना चाहते हैं।
सिद्धांत रूप में, एल्गोरिथ्म बहुत अधिक स्पष्ट था और इस प्रकार किसी भी हाथ से लिखे गए कार्यान्वयन पर बेहतर था। लेकिन फिर ... बाइंडर्स? Memfun? मूल रूप से C ++ इंटर्न कैसे एक सदस्य समारोह की पकड़ पाने के लिए? अपने काम के लिए, मुझे उनकी परवाह नहीं है! न ही मैं इस क्रिया, खौफनाक सिंटैक्स से पीड़ित होना चाहता हूं।
अब दूसरी संभावना:
for (std::vector<Foo>::const_iterator it = vec.begin(); it != vec.end(); ++it)
{
bar.process(*it);
}
दी, यह पहचान करने के लिए एक सामान्य पैटर्न है, लेकिन ... पुनरावृत्तियां बनाना, लूपिंग, इंक्रीमेंटिंग, डेरेफेरिंग। ये सभी चीजें हैं जिन्हें मैं अपना काम पूरा करने के लिए परवाह नहीं करता हूं।
बेशक, यह waay पहले समाधान की तुलना में बेहतर लग रहा है (कम से कम, पाश शरीर लचीला और काफी स्पष्ट है), लेकिन अभी भी, यह वास्तव में नहीं है कि महान। हम इस का उपयोग करेंगे अगर हमारे पास कोई बेहतर संभावना नहीं थी, लेकिन शायद हमारे पास है ...
एक बेहतर तरीका?
अब वापस for_each
। क्या सचमुच यह कहना बहुत अच्छा नहीं होगा for_each
और जो ऑपरेशन किया जाना है, उसमें भी लचीला होना चाहिए? सौभाग्य से, सी ++ 0x लैम्ब्डा के बाद से, हम हैं
for_each(v.begin(), v.end(), [&](const Foo& x) { bar.process(x); })
अब जब हमने कई संबंधित स्थितियों के लिए एक सार, सामान्य समाधान ढूंढ लिया है, तो यह ध्यान देने योग्य है कि इस विशेष मामले में, एक परम # 1 पसंदीदा है :
foreach(const Foo& x, vec) bar.process(x);
यह वास्तव में उससे ज्यादा स्पष्ट नहीं हो सकता। शुक्र है, C ++ 0x एक समान सिंटैक्स बिल्ट-इन है !
map(bar.process, vec)
हालांकि साइड इफेक्ट्स के लिए मानचित्र हतोत्साहित किया जाता है और मानचित्र पर सूची बोध / जनरेटर अभिव्यक्तियों की सिफारिश की जाती है)।