2011-09-07 13 views
6

यह सवाल 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 & लेता है मूल्यांकन करने के लिए है। मेरी आंत भावनाएं मुझे बताती हैं कि बढ़ावा में यह समाधान है। :-)

+0

आप केवल मूल्यों (ढूंढना चाहते हैं जो मामले http में: // www.boost.org/doc/libs/release/libs/range/doc/html/range/reference/adaptors/reference/map_values.html उत्तर है) या पूरी कुंजी, मूल्य जोड़ी के लिए पुनरावर्तक जहां मूल्य predicate संतुष्ट ? – Cubbi

+0

@ कब्बी: यह जवाब नहीं है अगर यह 'std :: find_if' के साथ काम नहीं करता है जो मानचित्र के एक पुनरावर्तक को लौटाता है। – Nawaz

+0

@ नवाज: मुझे नहीं पता कि std :: find_if आवश्यक है या नहीं। यदि नहीं, तो मैं http://www.cplusplus.com/reference/stl/map/upper_bound/ के साथ जाऊंगा जो तेजी से होना चाहिए, और कोड की केवल एक साधारण पंक्ति होनी चाहिए। –

उत्तर

9

वास्तव में, बूस्ट.फ्यूजन और बूस्ट। फ़ॉएनिक्स में बिल्कुल वही है जो आप अंतर्निहित चाहते हैं।

एक adapt std::pair<> as a conforming Fusion sequence करने के लिए आवश्यक शीर्ष लेख शामिल हैं, तो एक का उपयोग करने के std::pair<>::first या std::pair<>::second (#include <boost/phoenix/fusion.hpp> के लिए सुनिश्चित हो) boost::fusion::at_c<> के फीनिक्स के आलसी संस्करण का उपयोग कर सकते हैं।

namespace phx = boost::phoenix; 
using phx::arg_names::arg1; 

auto it = std::find_if(m.begin(), m.end(), phx::at_c<1>(arg1) > n); 

संपादित करें: पूर्ण नमूना, कुलपति ++ 2010 SP1 + बूस्ट 1.47.0 के साथ परीक्षण किया:

#include <algorithm> 
#include <map> 
#include <string> 
#include <iostream> 
#include <boost/fusion/include/std_pair.hpp> 
#include <boost/phoenix/core.hpp> 
#include <boost/phoenix/operator.hpp> 
#include <boost/phoenix/fusion.hpp> 

int main() 
{ 
    namespace phx = boost::phoenix; 
    using phx::arg_names::arg1; 

    std::map<std::string, int> m; 
    m["foo"] = 1; 
    m["bar"] = 2; 
    m["baz"] = 3; 
    m["qux"] = 4; 
    m["quux"] = 5; 
    m["corge"] = 6; 
    m["grault"] = 7; 
    m["garply"] = 8; 
    m["waldo"] = 9; 
    m["fred"] = 10; 
    m["plugh"] = 11; 
    m["xyzzy"] = 12; 
    m["thud"] = 13; 

    int const n = 6; 
    auto it = std::find_if(m.cbegin(), m.cend(), phx::at_c<1>(arg1) > n); 
    if (it != m.cend()) 
     std::cout << it->first << '\n'; // prints "fred" 
} 
+0

कृपया एक पूर्ण कामकाजी और परीक्षण समाधान पोस्ट करें। मैं यह नहीं कहना चाहता कि यह संकलन या काम नहीं करता है। हालांकि, मैं आपके द्वारा सुझाए गए कार्यों को करने की कोशिश कर रहा हूं। – Nawaz

+0

@ नवाज: संपादित। – ildjarn

+0

ठीक है। मैंने इसे संकलित करने की कोशिश की, और यह संकलन में विफल रहा: http://ideone.com/EgALC – Nawaz

संबंधित मुद्दे