2011-03-07 13 views
10

second` `p-> first` और` p-> वापस जाने के लिए वहाँ एक builtin समारोह उद्देश्य यह है कि रिटर्न p->first और p->second है, ताकि मैं खुशी सेसी ++ समारोह वस्तु

transform(m.begin(),m.end(),back_inserter(keys),get_first); 
transform(m.begin(),m.end(),back_inserter(vals),get_second); 

एसटीएल आधारित समाधान लिख सकते हैं सबसे अच्छा है, boost समाधान दूसरा सर्वोत्तम है।

हाँ, मुझे boost::lambda पता है, मैं इसका उपयोग शुरू नहीं करना चाहता हूं।

+1

ऐसा लगता है आपने

struct select1st { template< typename K, typename V > const K& operator()(std::pair<K,V> const& p) const { return p.first; } }; struct select2nd { template< typename K, typename V > const V& operator()(std::pair<K,V> const& p) const { return p.second; } }; 

यहाँ एक विकल्प है, वास्तव में और अधिक लचीला संस्करण है एहसास हुआ कि एसटीएल (या संभवतः बढ़ावा देने) में कोई प्रत्यक्ष समर्थन मौजूद नहीं है, क्यों नहीं, यह आपके लिए ऐसा करने के लिए एक साधारण फ़ंक्शन टेम्पलेट लिखें? यह 'बाइंड' दृष्टिकोण या गैर मानक दृष्टिकोण से स्पष्ट होना चाहिए ... – Nim

+1

@ नीम, शायद यह एक अच्छा विचार है, हालांकि मुझे हमेशा डर है कि टीम में हर कोई अपने संस्करण के साथ आएगा 'littleTidbitMissingFromSpec', इसलिए यदि मुझे बढ़ावा देने पर कुछ ठोस मिल सकता है, तो यह बेहतर होगा। –

+0

एक अच्छी तरह से प्रलेखित यूटिल (या ऑक्स) नेमस्पेस है जो आपको चाहिए! ;) – Nim

उत्तर

9

g++ और SGI को select1st और select2nd नामक गैर-मानक एक्सटेंशन हैं। तो इसके लिए एसटीएल में शायद कुछ भी नहीं है।

बूस्ट का बाँध भी है कि, यह एक सूचक सही सदस्य समारोह

boost::bind(&std::map<string,string>::value_type::second,_1) 
2

को दे सकते हैं आप सी का उपयोग कर सकते हैं ++ 0x आप जी ++ 4.5 के बाद से वास्तविक lambdas उपयोग कर सकते हैं या आप नए उपयोग कर सकते हैं tuple-library जो std :: जोड़े के साथ पूरी तरह से संगत है। फिर आप पहले और std :: < 1> दूसरे के लिए std :: < 0> प्राप्त कर सकते हैं।

यदि आप सी ++ 98 से बंधे हैं तो आप std :: pair के बजाय std :: tr1 :: tuple का उपयोग कर सकते हैं, क्योंकि TR1 में std :: pair के साथ काम नहीं करता है।

इसके अलावा आप टीआर 1 (tr1/functional) से बाइंड का उपयोग कर सकते हैं जैसे एलाजार ने इसका वर्णन किया है।

4

हम आसानी से एक select1st और select2nd लिख सकते हैं:

struct select1st 
{ 
    template< typename P > 
    typename P::first_type const& operator()(P const& p) const 
    { 
     return p.first; 
    } 
}; 

struct select2nd 
{ 
    template< typename P > 
    typename P::second_type const& operator()(P const& p) const 
    { 
     return p.second; 
    } 
}; 

बाद में:

transform(m.begin(),m.end(),back_inserter(keys), select1st()); 
transform(m.begin(),m.end(),back_inserter(vals), select2nd()); 
संबंधित मुद्दे