The map iterator will provide you with a pair , where first is the int key, and second is the value of the pair map, so if you had an iterator, you would need at least all the values of it->second.first . The min_element function expects a comparison function for its third argument, so you need to build a comparison function that implements second.first from its two arguments.
We will start with some typedefs to make the code more readable:
typedef std::pair<short, float> val_type; typedef std::map<int, val_type> map_type; map_type m;
We will use Boost.Lambda for our overloaded operators, allowing us to use operator< . Boost.Bind can bind member variables as well as member functions, so we will use this as well.
#include <boost/bind.hpp> #include <boost/lambda/lambda.hpp> using boost::bind; // Comparison is (_1.second.first < _2.second.first) std::cout << std::min_element(m.begin(), m.end(), bind(&val_type::first, bind(&map_type::iterator::value_type::second, _1)) < bind(&val_type::first, bind(&map_type::iterator::value_type::second, _2)) )->second.first;
This will also work with boost::lambda::bind .
Rob kennedy
source share