Проблема в том, что это:
bool MyClass::compare
Требуется экземпляр класса для вызова. То есть вы не можете просто позвонить MyClass::compare
, но вам нужно someInstance.compare
. Однако min_element
нуждается в первом.
Простое решение - сделать это static
:
static bool MyClass::compare
// ...
min_element(mymap.begin(), mymap.end(), &MyClass::compare);
Это больше не требует вызова экземпляра, и ваш код будет в порядке. Вы можете сделать это более общим с помощью функтора:
struct compare2nd
{
template <typename T>
bool operator()(const T& pLhs, const T& pRhs)
{
return pLhs.second < pRhs.second;
}
};
min_element(mymap.begin(), mymap.end(), compare2nd());
Все, что это делает, это захватывает вторую из каждой пары и захватывает их, работает с любой парой. Это может быть сделано для общего, но это слишком много.
Если вам нужно поискать по значению достаточно, я рекомендую вам использовать Boost's Bimap . Это двунаправленная карта, поэтому ключ и значение могут быть использованы для поиска. Вы просто получите фронт карты ключ-значение.
Наконец, вы всегда можете просто отслеживать минимальный элемент, входящий в вашу карту. Каждый раз, когда вы вставляете новое значение, проверяйте, не ниже ли оно вашего текущего значения (и, вероятно, оно должно быть указателем на пару карт, начинайте его с нуля), и, если оно ниже, укажите на новое наименьшее. Запрос самого нижнего становится таким же простым, как разыменование указателя.