我是否有理由不能将比较仿函数作为构造函数参数传递给map
:
map<int, string, greater<int>> foo;
//map<int, string> foo(greater<int>()); Doesn't work
或者为什么我不能在没有提供自己的比较类型的情况下传递lambda:
map<int, string, function<bool(const int&, const int&)>> bar([](const int& lhs, const int& rhs){ return lhs > rhs; });
//map<int, string> bar([](const int& lhs, const int& rhs){ return lhs > rhs; }); Doesn't work
我希望能够声明map<int, string>
并使用比较器构建它。为什么我不能?
答案 0 :(得分:1)
这个问题源于一种误解。要清除它:
Functors是不函数
的对象尝试将函数指针或lambda分配给对象没有任何意义。所以这不可能做到: 定义带有函数指针或lambda的map<int, string> bar([](const int& lhs, const int& rhs){ return lhs > rhs; });
map
的方法是使用问题中的模板参数:map<int, string, function<bool(const int&, const int&)>>
问题中两个构思错误的选项中间是另一个误解: 不起作用,因为比较器模板参数是类型 map<int, string, [](const int& lhs, const int& rhs){ return lhs > rhs; }>
map
的成员,不初始化值。 所以使用函数指针或lambda比较器的map
必须始终将该值传递给map
构造函数:map<int, string, function<bool(const int&, const int&)>> bar([](const int& lhs, const int& rhs){ return lhs > rhs; })
否则将使用function<bool(const int&, const int&)>()
用于map
中的比较。
现在可能已经很清楚,但由于仿函数是对象,因此无法传递不相关的对象是完全不同类型对象的构造值。调用 就像调用map<int, string> foo(greater<int>())
一样。 比较器模板参数为仿函数的less<int> foo = greater<int>
map
唯一可接受的compatator构造函数参数可以转换为模板参数中仿函数类型的对象:map<int, string, greater<int>> foo(greater<int>{})
这显然是不必要的,因为如果没有提供参数并且greater<int>
是默认构造的,那么map
会导致相同的成员初始化,因此map<int, string, greater<int>>
就足够了。