2009-01-27 7 views
7

Sé que esta pregunta ha surgido de varias maneras antes, pero esto es ligeramente diferente.Funcionalidad de llaves/valores para iteradores en C++

Tengo una clase que contiene un estándar :: map. Aunque deseo utilizar el mapa para otros fines dentro de la clase, externamente quiero exponer un adaptador de iterador a solo los valores dentro del mapa (es decir, el segundo elemento en el estándar :: par).

Por ejemplo en Python que podría hacer algo como esto:

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

¿Cómo voy a ir haciendo esto en C++, ocultando la implementación dentro de la clase?

Gracias,

Dan

Respuesta

16

Eche un vistazo a Boost de transform_iterator que proporciona exactamente este tipo de funcionalidad:

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 … 
}; 

ya se puede iterar sobre los valores, por ejemplo, como este:

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

hmm, no puedo conseguir esto para compilar, ¿realmente no debería haber ningún tipo de devolución en el operador get_value()? – Dan

+0

Estás en lo cierto, está editado. –

+0

Stack Overflow es tan genial. (No pude probar el código, no tenía Boost instalado en casa). –