map比较构造函数参数

时间:2016-03-02 20:21:01

标签: c++ templates dictionary comparator constructorargument

我是否有理由不能将比较仿函数作为构造函数参数传递给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>并使用比较器构建它。为什么我不能?

[Live Example]

1 个答案:

答案 0 :(得分:1)

这个问题源于一种误解。要清除它:

Functors是函数

的对象

尝试将函数指针或lambda分配给对象没有任何意义。所以这不可能做到: map<int, string> bar([](const int& lhs, const int& rhs){ return lhs > rhs; }); 定义带有函数指针或lambda的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>>就足够了。