使用 lambda 函数在 std::unordered_map 中查找最小值

Posted

技术标签:

【中文标题】使用 lambda 函数在 std::unordered_map 中查找最小值【英文标题】:Using lambda function to find a minimum value in a std::unordered_map 【发布时间】:2019-01-30 23:55:21 【问题描述】:

我正在尝试在地图中找到具有最小值的元素。例如,如果我的地图有

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

我想找到元素(3, 1.24)


我写了下面的代码,尝试写一个lambda格式的比较器

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.

知道我做错了什么以及解决此问题的正确方法是什么?谢谢!

【问题讨论】:

lambda 从哈希映射中获取迭代器,而不是映射。您想比较两对值,而不是映射。 现在可以使用了。感谢您的帮助! 【参考方案1】:

您的 lambda 应该是二进制谓词,它采用两对 std::pair&lt;const int, double&gt;

将 lambda 更改为如下:

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; );
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

【讨论】:

【参考方案2】:

您正在尝试使用接受映射本身而不是其元素的 lambda:

[](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 引用传递元素,而不是每次迭代都复制它们。

【讨论】:

以上是关于使用 lambda 函数在 std::unordered_map 中查找最小值的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 lambda 函数安排 lambda 函数的执行吗?

使用nodejs中的AWS Lambda函数上传音频文件

Python基础之lambda表达式

使用命名的 lambda 与函数 - 在 lambda 的情况下变量的额外空间使用?

在函数中使用 lambda

AWS Lambda:即使在STS:AssumeRole成功之后,lambda函数仍然使用旧的IAM角色