C ++: использование boost lambda для получения максимальных значений в std :: tr1 :: unordered_map - PullRequest
1 голос
/ 11 мая 2011

У меня есть std::tr1::unordered_map<int, A> map;, где A - это класс с переменной-членом (int x).

Я бы хотел найти ключ i на карте, чтобы map [i] .x был максимальным.

Я знаю, что могу написать функтор с std :: max_element. Как мне сделать это вместо этого, используя повысить лямбду (я пытаюсь это выучить)? У меня нет C ++ 0x.

В качестве дополнительного вопроса, что если бы у меня был класс А, определенный ниже:

класс А { int x; int y; };

И я хотел найти максимум w.r.t x (если этот максимум был 0, найдите максимум по отношению к y). Опять же, одним из решений было бы перебирать кортежи карты (сохраняя оба Максимумы в памяти). Есть ли способ изменить max_element, чтобы сделать это?

Ответы [ 2 ]

2 голосов
/ 11 мая 2011

boost.lambda использует boost.bind для доступа к переменным-членам.Это выглядит немного многословно:

typedef std::tr1::unordered_map<int, A> map_t;
map_t m;

A max_a = std::max_element(m.begin(), m.end(),
                bind(&A::x, bind(&map_t::value_type::second, _1))
              < bind(&A::x, bind(&map_t::value_type::second, _2))
         )->second;

test: https://ideone.com/V6SZL

Вы можете уменьшить половину головной боли с помощью boost.range

A max_a = *boost::max_element(m | map_values, bind(&A::x, _1) < bind(&A::x, _2));

Но на практике,Я думаю, что функтор был бы лучшим.

1 голос
/ 11 мая 2011

Поскольку вы только начинаете изучать Boost.Lambda, сейчас самое время забыть о его существовании и вместо этого изучить Boost.Phoenix . Boost.Phoenix является заменой Boost.Lambda и является значительно более мощным и часто более кратким:

typedef std::tr1::unordered_map<int, A> map_t;
map_t m;

int i = std::max_element(
    m.begin(),
    m.end(),
    bind(&A::x, at_c<1>(_1)) < bind(&A::x, at_c<1>(_2))
)->first;
A& max_a = m[i];

Обратите внимание, что Boost.Phoenix v2 в настоящее время является суббиблиотекой Boost.Spirit , но в 1.47.0 Boost.Phoenix v3 планируется выпустить в качестве надлежащей автономной библиотеки Boost.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...