Итератор map
даст вам pair
, где first
- это ключ int
, а second
- это значение pair
карты, поэтому, если у вас был итератор it
, вы быхотите минимум всех значений it->second.first
.Функция min_element
ожидает функцию сравнения для своего третьего аргумента, поэтому вам нужно создать функцию сравнения, которая проецирует second.first
из двух ее аргументов.
Мы начнем с некоторых определений типов, чтобы сделать код болеедля чтения:
typedef std::pair<short, float> val_type;
typedef std::map<int, val_type> map_type;
map_type m;
Мы собираемся использовать Boost.Lambda для перегруженных операторов, что позволяет нам использовать operator<
.Boost.Bind может связывать как переменные-члены, так и функции-члены, поэтому мы также воспользуемся этим.
#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;
Это также будет работать с boost::lambda::bind
.