Использование лямбда-функции для поиска минимального значения в std :: unordered_map - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь найти элемент с минимальным значением на карте.Например, если моя карта имеет

 { (1, 12.3),(2, 6.51), (3, 1.24)}

, я хотел бы найти элемент (3, 1.24).


. Я написал следующий код, который пытается написать компаратор влямбда-формат

std::pair<int, double> min = *std::min_element(
    my_map.begin(), my_map.end(),
    [](std::unordered_map<int, double> a, std::unordered_map<int, double> b) { return a.second < b.second; });

Но я получил следующие ошибки:

error: no matching function for call to object of type '(lambda at my_code.cpp:118:9)'
            if (__comp(*__i, *__first))
                ^~~~~~
my_code.cpp:116:40: note: in instantiation of function template specialization 'std::__1::min_element<std::__1::__hash_map_iterator<std::__1::__hash_iterator<std::__1::__hash_node<std::__1::__hash_value_type<int, double>, void *> *> >, (lambda at my_code.cpp:118:9)>' requested here
    std::pair<int, double> min = *std::min_element(
                                       ^
my_code.cpp:118:9: note: candidate function not viable: no known conversion from 'std::__1::__hash_map_iterator<std::__1::__hash_iterator<std::__1::__hash_node<std::__1::__hash_value_type<int, double>, void *> *> >::value_type' (aka 'pair<const int, double>') to 'std::unordered_map<int, double>' for 1st argument
        [](std::unordered_map<int, double> a, std::unordered_map<int, double> b) { return a.second < b.second; });
        ^
my_code.cpp:118:9: note: conversion candidate of type 'void (*)(std::unordered_map<int, double>, std::unordered_map<int, double>)'
3 errors generated.

Есть идеи, что я сделал не так и как правильно это исправить?Спасибо!

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Вы пытаетесь использовать лямбду, которая принимает сами карты, а не ее элементы:

[](std::unordered_map<int, double> a, std::unordered_map<int, double> b)

, поэтому она либо (многословна):

[](std::unordered_map<int, double>::value_type a, std::unordered_map<int, double>::value_type b)

, либо проще:

[](std::pair<int, double> a, std::pair<int, double> b)

или, если у вас c ++ 14 или более поздняя версия:

[](auto a, auto b)

, вы также можете рассмотреть возможность передачи элементов по ссылке const, чтобы не копировать их для каждой итерации.

0 голосов
/ 31 января 2019

Ваша лямбда должна быть двоичным предикатом, который принимает две пары std::pair<const int, double>.

Измените лямбду следующим образом:

std::pair<int, double> min = *std::min_element(
    my_map.begin(), my_map.end(),
    [](const auto &a, const auto &b) { return a.second < b.second; });

или более явно:

std::pair<int, double> min = *std::min_element(
    my_map.begin(), my_map.end(),
    [](const std::pair<const int, double> &a, const std::pair<const int, double> &b) { return a.second < b.second; });
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...