2008-12-16 9 views
10

क्या किसी को पता है कि एक std :: जोड़ी के तत्वों तक पहुंचने के लिए कोई वास्तविक तथ्य (यानी, TR1 या बूस्ट) सी ++ फ़ंक्शन ऑब्जेक्ट है या नहीं? पिछले 24 घंटों में दो बार मैंने कामना की है कि मेरे पास पर्ल हैश के लिए keys फ़ंक्शन जैसा कुछ था। उदाहरण के लिए, std :: map ऑब्जेक्ट पर std :: transform को चलाने के लिए अच्छा लगेगा और सभी चाबियाँ (या मान) को किसी अन्य कंटेनर पर डंप करें। मैं निश्चित रूप से ऐसी फ़ंक्शन ऑब्जेक्ट लिख सकता हूं लेकिन मैं उस चीज़ का पुन: उपयोग करना पसंद करूंगा जिस पर बहुत सारी आंखें हैं।क्या std :: pair को अलग करने के लिए मानक सी ++ फ़ंक्शन ऑब्जेक्ट है?

उत्तर

17

boost::bind जो आप ढूंढ रहे हैं वह है।

boost::bind(&std::pair::second, _1); // returns the value of a pair 

उदाहरण:

typedef std::map<std::string, int> map_type; 

std::vector<int> values; // will contain all values 
map_type map; 
std::transform(map.begin(), 
       map.end(), 
       std::back_inserter(values), 
       boost::bind(&map_type::value_type::second, _1)); 
4

जिस तरह से आपने अपना प्रश्न कहा है, मुझे यकीन नहीं है कि यह एक उचित प्रतिक्रिया है, लेकिन boost::tie (बूस्ट :: ट्यूपल लाइब्रेरी का हिस्सा) का प्रयास करें। यह std::pair एस पर भी काम करता है।

3

boost::bind अक्सर एल्गोरिदम साथ प्रयोग के लिए std :: नक्शा कंटेनर अनुकूल करने के लिए प्रयोग किया जाता है। Here एक उदाहरण है:

void print_string(const std::string& s) { 
    std::cout << s << '\n'; 
} 


std::map<int,std::string> my_map; 
my_map[0]="Boost"; 
my_map[1]="Bind"; 


std::for_each(my_map.begin(), my_map.end(), 
       boost::bind(&print_string, boost::bind(
       &std::map<int,std::string>::value_type::second,_1))); 
1

विभिन्न कंटेनरों के संयोजन का उपयोग कर के बारे में क्या।

उदाहरण के लिए, जब मैं और एक पूरक मानचित्र में निहित आइटम आइटम कि जहां पूरक मानचित्र में शामिल नहीं में एक सदिश विभाजन करना चाहता था मैं निम्नलिखित प्रयोग किया है:

typedef int DWORD; 
typedef std::pair<std::string, bool> user_info; 
typedef std::map<DWORD, user_info> USER_MAP; 
typedef std::vector<DWORD> VEC_STAFF; 

VEC_STAFF::iterator it = std::partition(Staff.begin(), Staff.end(), (bind(&USER_MAP::find, m_Users, _1) != m_Users.end())); 

अब मैं एक दूसरी समस्या है - के दौरान एप्लिकेशन का चलाना user_info का स्टेटस बूल बदल सकता है, और बाद में मैं वेक्टर को उन वस्तुओं के साथ फिर से विभाजित करना चाहता हूं जिनके पास केवल पूरक मानचित्र में निहित होने के बजाय सत्य की स्थिति बूल है।

हालांकि मुझे एक नेस्टेड जोड़ी के दूसरे आइटम तक पहुंचने में समस्या आ रही है।

मैंने निम्नलिखित की कोशिश की लेकिन मुझे नेस्टेड जोड़ी तक पहुंच नहीं लग रही है!

CActiveUsers::VEC_STAFF::const_iterator itCurEnd = partition(Staff.begin(), Staff.end(), bind(&USER_MAP::value_type::second::second, bind(&USER_MAP::find, &m_Users, _1)) == true); 
1

बूस्ट :: एडाप्टर पर एक नज़र डालें। नक्शा कुंजी या मूल्यों को बिना किसी मध्यवर्ती कंटेनर में कॉपी किए बिना पूर्वनिर्धारित एडाप्टर हैं।

0

एक विकल्प जो सुझाया नहीं गया था std::tr1::get है। n1745 के खंड 6.1.2 और 6.1.4 देखें।

std::pair< std::string, int > p("foo", 1729); 

int hr = std::tr1::get<1>(p); 

निश्चित रूप से के रूप में map निकासी मामले आपने उल्लेख किया है लेकिन अभी भी के बारे में जानने लायक में bind के रूप में उपयोग करने के लिए आसान नहीं है। जोहान्स कोड को अपनाना:

typedef std::map<std::string, int> map_type; 

std::vector<int> values; // will contain all values 
map_type map; 

// std::tr1::get is overloaded so we need to help the compiler choose 
const map_type::value_type::second_type & (*get)(const map_type::value_type &) = 
    &std::tr1::get< 1, map_type::value_type::first_type, map_type::value_type::second_type >; 

std::transform(map.begin(), 
       map.end(), 
       std::back_inserter(values), 
       get); 
संबंधित मुद्दे