2009-01-27 4 views
7

में Iterators के लिए कुंजी/मान कार्यक्षमता पहले मुझे पता है कि यह प्रश्न पहले विभिन्न guises में आया है, लेकिन यह थोड़ा अलग है।सी ++

मेरे पास एक कक्षा है जिसमें std :: map शामिल है। हालांकि मैं कक्षा के अंदर अन्य प्रयोजनों के लिए मानचित्र का उपयोग करना चाहता हूं, बाहरी रूप से मैं एक इटरेटर एडाप्टर को मानचित्र के अंदर केवल मूल्यों (यानी std :: pair में दूसरा आइटम) का खुलासा करना चाहता हूं।

def __iter__(self): 
    return self._dict.itervalues() 

मैं C++ यह कर, वर्ग के अंदर कार्यान्वयन छुपा के बारे में कैसे जाना है:

अजगर में उदाहरण के लिए मैं कुछ इस तरह कर सकता है?

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

class your_class { 
    typedef map<int, float> TMap; 
    TMap mymap; 

public: 
    typedef get_value<TMap::key_type, TMap::data_type> F; 
    typedef 
     boost::transform_iterator<F, TMap::iterator> 
     value_iterator; 

    value_iterator begin() { return make_transform_iterator(mymap.begin(), F()); } 

    value_iterator end() { return make_transform_iterator(mymap.end(), F()); } 

    // TODO Same for const versions. 
    // Rest of the interface … 
}; 

अब आप मूल्यों पर पुनरावृति कर सकते हैं, उदाहरण के लिए:

धन्यवाद,

दान

उत्तर

16

बूस्ट के transform_iterator पर एक नज़र जो कार्यक्षमता का वास्तव में इस तरह प्रदान करता है इस तरह:

your_class c; 
// Fill c with some values … 
copy(c.begin(), c.end(), ostream_iterator<float>(cout, " ")); 
+0

हम्म, मैं इसे संकलित करने के लिए नहीं मिल सकता, क्या वास्तव में get_value ऑपरेटर() पर कोई वापसी प्रकार नहीं होना चाहिए? – Dan

+0

आप सही हैं, इसे संपादित किया गया है। –

+0

स्टैक ओवरफ़्लो बहुत अच्छा है। (मैं कोड का परीक्षण नहीं कर सका, मेरे पास घर पर बूस्ट स्थापित नहीं था।) –