Re: Multimap: how to get a key list?
In article
<5507049b-6c8a-4b4e-a8d4-0e9dcf92c3b5@33g2000yqj.googlegroups.com>,
Michael Doubez <michael.doubez@free.fr> wrote:
Another solution is to use decoration:
template<typename iterator_type>
class key_iterator:
std::iterator< typename iterator_type::iterator_category
// return type of iterator is key type
, typename iterator_type::value_type::first_type
, typename iterator_type::difference_type
>
{
public:
// put here the typedefs iterator_category, ...
// build from
key_iterator(const iterator_type& i):it(i){}
// usual operation on iterator
key_iterator& operator++()
{ ++it;return *this;}
view_iterator operator++(int)
{ return key_iterator(it++);}
bool operator == (const key_iterator& rhs) const
{return it == rhs.it;}
// and so on for other iterator operations
// return key
reference operator*() const
{return it->first; }
pointer operator->() const
{return &it->first; }
private:
iterator_type it;
};
And then you can use
template<class T>
key_iterator<typename T::iterator_type> key_begin(T& container)
{
return container.begin();
}
template<class T>
key_iterator<typename T::iterator_type> key_end(T& container)
{
return container.end();
}
You can do whatever you want on the keys of an associative container.
std::accumulate(key_begin(aMap),key_end(aMap), 0 );
I think part of the point of the exorcise was to remove duplicate keys
from the multimap.