This is one of the possible ways I come out:
struct RetrieveKey
{
template <typename T>
typename T::first_type operator()(T keyValuePair) const
{
return keyValuePair.first;
}
};
map<int, int> m;
vector<int> keys;
// Retrieve all keys
transform(m.begin(), m.end(), back_inserter(keys), RetrieveKey());
// Dump all keys
copy(keys.begin(), keys.end(), ostream_iterator<int>(cout, "\n"));
Of course, we can also retrieve all values from the map by defining another functor RetrieveValues.
Is there any other way to achieve this easily? (I'm always wondering why std::map does not include a member function for us to do so.)
Based on @rusty-parks solution, but in c++17:
@DanDan's answer, using C++11 is:
and using C++14 (as noted by @ivan.ukr) we can replace
decltype(map_in)::value_type
withauto
.Also, if you have Boost, use transform_iterator to avoid making a temporary copy of the keys.
While your solution should work, it can be difficult to read depending on the skill level of your fellow programmers. Additionally, it moves functionality away from the call site. Which can make maintenance a little more difficult.
I'm not sure if your goal is to get the keys into a vector or print them to cout so I'm doing both. You may try something like this:
Or even simpler, if you are using Boost:
Personally, I like the BOOST_FOREACH version because there is less typing and it is very explicit about what it is doing.
You can use the versatile boost::transform_iterator. The transform_iterator allows you to transform the iterated values, for example in our case when you want to deal only with the keys, not the values. See http://www.boost.org/doc/libs/1_36_0/libs/iterator/doc/transform_iterator.html#example
Bit of a c++11 take: