example - map c++ como funciona
Funcionalidad de llaves/valores para iteradores en C++ (1)
Sé que esta pregunta ha aparecido en varias formas antes, pero esto es ligeramente diferente.
Tengo una clase que contiene un std :: 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 podría hacer algo como esto:
def __iter__(self):
return self._dict.itervalues()
¿Cómo hago esto en C ++, ocultando la implementación dentro de la clase?
Gracias,
Dan
Eche un vistazo al transform_iterator
de Boost 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 …
};
Ahora puede iterar sobre los valores, por ejemplo, de esta manera:
your_class c;
// Fill c with some values …
copy(c.begin(), c.end(), ostream_iterator<float>(cout, " "));