c++ - Rework for loop over STL container to use functional techniques -


मेरे पास एक std :: vector संकेतक व्यक्ति ऑब्जेक्ट्स है, जिनके सदस्य फ़ंक्शन हैं std :: string getName () const । एसटीएल एल्गोरिदम का उपयोग करना मैं सदिश में सभी व्यक्ति ऑब्जेक्ट्स को गिनना चाहता हूँ जहां getName () रिटर्न "चाड"।

व्यवहार बस पर चलना लूप होगा:

  int num_chads = 0; (Std :: vector & lt; person * & gt; :: const_iterator = = vec.begin (); it! = Vec.end (); ++ यह) {if ((* it) - & gt; getName () == "चाड") ++ num_chads; }   

मैं इसे फिर से काम करना चाहता हूं इसलिए यह सभी एसटीएल एल्गोरिदम और फ़ैंक्टर्स आदि का उपयोग करता है (इसे अधिक कार्यात्मक-उन्मुख बनाना)। यह वही है जो मुझे करने की आवश्यकता है:

  const int num_chads = std :: count_if (vec.begin (), vec.end (), std :: bind1st (std :: bind2nd) (Std :: equal_to, mem_fun (व्यक्ति :: getName)), "चाड"));   

जैसा कि आप संभवतः यह कह सकते हैं कि यह काम नहीं करता है। सबसे पहले, जैसा कि मैं समझता हूं, आप bind1st / bind2nd को binder1st / binder2nd वस्तुओं का उपयोग नहीं कर सकते क्योंकि वे विशेष रूप से std :: binary_functions के साथ काम करने के लिए डिज़ाइन किए गए हैं। दूसरे, और अधिक महत्वपूर्ण बात, मुझे नहीं लगता कि मैं सही तकनीक का उपयोग कर रहा हूं। मैं करो "चाड" में एक तर्क को बाँधना चाहता हूं, लेकिन इटरेटर तर्क के साथ, मैं वास्तव में बस iterator मान को एक स्ट्रिंग में बदलना चाहता हूँ equals_to

मुझे लगता है कि बूस्ट का उपयोग कर ऐसा करना संभव है, लेकिन क्या यह सिर्फ कोर सी +0 03 (यानी कोई सी ++ 0x लैम्बा!) का उपयोग कर संभव है?

संपादित करें: क्या कोई भी ऐसे उदाहरण के साथ आया है जो उपयोगकर्ता परिभाषित परिभाषा का उपयोग नहीं करता है (यानी सिर्फ स्टडी टूलकिट में दिए गए उपकरण का उपयोग करके)?

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

चूंकि कोई भी वास्तविक बढ़ावा कोड अभी तक नहीं बढ़ाया, सी ++ 9 को बढ़ावा देने के साथ: < पूर्व> ptrdiff_t num_chads = std :: count_if (vec.begin (), vec.end (), बढ़ावा :: बाँध (& amp; व्यक्ति :: getName, _1) == "चाड");

टेस्ट रन

शुद्ध सी ++ के रूप में, मुझे नहीं लगता कि यह compose1 एडेप्टर के बिना संभव है, जो कि एसटीएल में मौजूद है लेकिन इसमें नहीं है सी ++ stdlib ...

और यहां यह है (एसटीएल के जीसीसी के कार्यान्वयन का प्रयोग करके)

  ptrdiff_t num_chads = std :: count_if (vec.begin (), vec.end (), __gnu_cxx :: compose1 (std :: bind2nd (std :: equal_to & lt; std :: स्ट्रिंग & gt; (), "चाड"), std :: mem_fun (& amp; person :: getName)));   

टेस्ट रन:

संपादित करें: व्यक्ति *

Comments