Re: What is the best way to iterate over a map? (or any paired container)
Diego Martins wrote:
However, in the bath tube, I though of a wierd solution: can we
implement a generic iterator wrapper for containers of std::pair<> that
returns only the .second when dereferencing? How?
There is a boost transform_iterator which does what it suggests it does
- it transforms the iterators whilst acting as an iterator itself. So
operator++ effectively increments your iterator whilst operator*
performs the transform on the way.
You can look up the detail of boost transform_iterator but the basis
would be something like this. (Note this is for illustration only).
template < typename FwdIter, typename Oper >
class transform_iterator_type
{
FwdIter iter;
Oper op;
// this traits class will get type that *iter produces
typedef typename iter_traits<FwdIter>::reference_type
reference_type;
public:
transform_iterator_type( FwdIter it, Oper o ) : iter (it), op(o)
{
}
transform_iterator_type operator++() { ++iter; return *this; }
// do the other operator++ and comparisons etc.
reference_type operator*() { return *iter; }
};
// now write function transform_iterator() to produce one
If yes, no need for for_each_second() and the similars
something like:
myFunction(int);
...
std::map<string,int> map;
...
std::for_each(SecondWrap(map.begin()),SecondWrap(map.end()),myFunction);
What do you think about that?
No need to rewrite the algorithm but we will need a transformer to
convert pair into
2nd even for the above. So
struct pair2nd
{
template <typename F, typename S > S operator() ( const std::pair<
F, S > & pair )
{
return pair.second;
}
};
With the new standard once we get auto we can cut out some of the work
above. No need for the traits template to determine the type of *Iter.
And the pair2nd can be simplified to just take one template parameter
and return auto type.
Anyway, with the above, use whatever algorithm calling the
transform_iterator with pair2nd as the transformer.
Diego Martins
HP Researcher
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]