代码之家  ›  专栏  ›  技术社区  ›  Cristian

如何在地图中找到最小值

  •  -3
  • Cristian  · 技术社区  · 7 年前

    我想在地图上找出最小值。我有一个函数来自 Finding minimum value in a map

    #import tool.mm
    std::map<std::string, float> direction;
    std::pair<std::string, float> min;
    
    direction["up"] = 50.0;
    direction["down"] = 20.0;
    direction["right"] = 100.0;
    direction["left"] = 200.0;
    
    min = *min_element(direction.begin(), direction.end(), &Tool::compare);
    

    这是什么 Tool 类的外观如下:

    //tool.mm
    class Tool {
    public:
        bool compare(std::pair<std::string, float> i, std::pair<std::string, float> j) {
            return (i.second < j.second);
        }
    };
    

    当我运行此函数时,显示一个错误

    Called object type 'bool (Tool::*)(std::__1::pair<std::__1::basic_string<char>, float>, std::__1::pair<std::__1::basic_string<char>, float>)' is not a function or function pointer
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   JeJo    7 年前

    这个 比较函数 你提供的不是 functor .

    应该是

    using Pair = std::pair<const std::string, float>; // just a alias type for convenience
    struct Tool
    {
        bool operator()(const Pair& i, const Pair& j)const 
            /*^^^^^^^^*/                            /*^^^*/
        {
            return (i.second < j.second);
        }
    };
    

    你应该这样称呼它

    min = *min_element(direction.begin(), direction.end(), Tool());
                                                           ^^^^^^
    

    但是,如果您可以访问C++ 11或更高版本,只需使用lambda,这将帮助您在调用的行上看到比较函数(二进制谓词)的定义。

    min = *min_element(direction.begin(), direction.end(), 
                       [](const auto& lhs, const auto& rhs){ return lhs.second < rhs.second;});