7

I know this questions has come up in various guises before, but this is slightly different.

I have a class which contains a std::map. Although I wish to use the map for other purposes inside the class, externally I want to expose an iterator adapter to just the values inside the map (ie the second item in the std::pair).

For example in python I might do something like this:

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

How do I go about doing this in c++, hiding the implementation inside the class?

Thanks,

Dan

1 Answer 1

16

Have a look at Boost's transform_iterator which provides exactly this kind of functionality:

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

Now you can iterate over the values, e.g. like this:

your_class c;
// Fill c with some values …
copy(c.begin(), c.end(), ostream_iterator<float>(cout, " "));
Sign up to request clarification or add additional context in comments.

2 Comments

hmm, i can't get this to compile, should there really be no return type on the get_value operator() ?
Stack Overflow is so cool. (I couldn't test the code, I didn't have Boost installed at home.)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.