यह सवाल another topic से प्रेरित है जो इस सवाल बन गया है है:मैं कुछ बूस्ट लाइब्रेरी का उपयोग कर std :: find_if और std :: मानचित्र कैसे काम कर सकता हूं?
पहले मूल्य एक नक्शे के कंटेनर
जो कई मायनों में हल किया जा सकता से उपयोगकर्ता द्वारा निर्दिष्ट मान से अधिक का पता लगाएं। एक सामान्य सी ++ 03 समाधान एक समर्पित फ़ंक्शन (या मज़ेदार) को परिभाषित करता है और इसे std::find_if
पर तीसरे तर्क के रूप में पास करता है।
सी ++ 11 में, एक एक समर्पित समारोह (या functor) को परिभाषित करने से बच सकते हैं, और बदले के रूप में lambda
का उपयोग कर सकते:
auto it = std:: find_if(m.begin(), mp.end(),
[n](const std::pair<std::string, int> & x) -> bool
{ return x.second > n; }
);
जो the accepted answer है।
मैं अभी भी एक छोटा और ठंडा समाधान ढूंढ रहा हूं। यदि यह एक वेक्टर थे, तो मैं सिर्फ एक शांत समाधान जो Boost.Phoenix
का उपयोग करता है और समाधान बहुत संक्षिप्त हो जाता है (ideone demo) सीखा:
std::vector<int> v = ...;
auto it = std::find_if(v.begin(), v.end(), arg1 > 4);
यहाँ arg1
एक functor वस्तु boost::phoenix::arg_names
नाम स्थान में परिभाषित किया गया है, और अभिव्यक्ति arg1>4
एक और मज़ेदार का मूल्यांकन करता है जो तब std::find_if
पर पारित हो जाता है।
एक त्वरित परीक्षण है (ideone),
std::cout<< (arg1 > 9)(v) << std::endl; //prints 0 if as v > 9 is false, else 1
//or store the functor first and then use it
const auto & f = arg1 > 9;
std::cout<< f(v) << std::endl; //prints 0 if as v > 9 is false, else 1
मेरा प्रश्न है, मैं नक्शा समस्या को हल करने, एक समान तरीके से चाहते हैं। क्या ऐसा कोई समाधान है? की तरह कुछ:
auto it = std::find_if(m.begin(),mp.end(), (???).second > n); //m is std::map
या,
auto it = std::find_if(m.begin(),mp.end(), at<1>(arg1) > n); //m is std::map
यह काम करने के लिए, अभिव्यक्ति at<1>(arg1) > 2
एक functor जो तर्क के रूप में const std::pair &
लेता है मूल्यांकन करने के लिए है। मेरी आंत भावनाएं मुझे बताती हैं कि बढ़ावा में यह समाधान है। :-)
आप केवल मूल्यों (ढूंढना चाहते हैं जो मामले http में: // www.boost.org/doc/libs/release/libs/range/doc/html/range/reference/adaptors/reference/map_values.html उत्तर है) या पूरी कुंजी, मूल्य जोड़ी के लिए पुनरावर्तक जहां मूल्य predicate संतुष्ट ? – Cubbi
@ कब्बी: यह जवाब नहीं है अगर यह 'std :: find_if' के साथ काम नहीं करता है जो मानचित्र के एक पुनरावर्तक को लौटाता है। – Nawaz
@ नवाज: मुझे नहीं पता कि std :: find_if आवश्यक है या नहीं। यदि नहीं, तो मैं http://www.cplusplus.com/reference/stl/map/upper_bound/ के साथ जाऊंगा जो तेजी से होना चाहिए, और कोड की केवल एक साधारण पंक्ति होनी चाहिए। –