MBZ*_*MBZ 12 c++ lambda map c++11
尝试map::compare
使用lambda 覆盖函数,似乎以下解决方案有效.
auto cmp = [](const int&a, const int& b) { return a < b; };
std::map<int, int, decltype(cmp)> myMap(cmp);
Run Code Online (Sandbox Code Playgroud)
但是,我必须先定义cmp
并稍后再使用它.
我可以在没有定义'cmp'的情况下这样做吗?
zau*_*ufi 19
不,您不能在未评估的上下文中使用lambda - 即示例中的模板参数.所以你必须在其他地方(使用auto
)定义它,然后使用decltype
......另一种方式,因为它已经提到使用"序数"仿函数
如果你的问题是关于" 如何使用lambda表达式*一次*当定义地图 ",你可以利用lambda表达式来的隐式转换std::function
是这样的:
#include <iostream>
#include <functional>
#include <map>
int main()
{
auto m = std::map<int, int, std::function<bool(const int&, const int&)>>{
[](const int& a, const int& b)
{
return a < b;
}
};
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您可以为该map
类型引入别名以减少以后的输入...
#include <iostream>
#include <functional>
#include <map>
#include <typeinfo>
typedef std::map< int, int, std::function<bool(const int&, const int&)> > MyMap;
int main()
{
auto cmp = [](const int& a, const int& b) { return a < b; };
MyMap map(cmp);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用std::function
为比较器类型提供适当的类型签名,您可以定义地图类型,然后分配您希望的任何lambda比较.
你可以做这样的事情,其中地图的类型是从你传递给函数的函数中推导出来的。
#include <map>
template<class Key, class Value, class F>
std::map<Key, Value, F> make_map(const F& f) {
return std::map<Key, Value, F>{f};
}
int main() {
auto my_map = make_map<int, int>([](const int&a, const int& b) { return a < b; });
my_map[10] = 20;
}
Run Code Online (Sandbox Code Playgroud)
我不认为这样做有很多理由,但我不会说它没用。通常,您需要一个已知的比较器,以便可以轻松地传递地图。通过上面的设置,您可以一直使用模板函数,如下所示
tempalte<class F>
void do_somthing(const std::map<int, int, F>& m) {
}
Run Code Online (Sandbox Code Playgroud)
这不一定是坏事,但我的直觉告诉我,拥有只能由泛型函数处理的类型是坏事。我认为它适用于 lambda 函数,但仅此而已。这里的解决方案是使用 std::function
#include <map>
#include <functional>
template<class Key, class Value>
using my_map_t = std::map<Key, Value, std::function<bool(const Key&, const Key&)>>;
int main() {
my_map_t<int, int> my_map{[](const int&a, const int& b) { return a < b; }};
my_map[10] = 20;
}
Run Code Online (Sandbox Code Playgroud)
现在你可以使用任何你想要的谓词,并且你有一个具体的类型可以使用,my_map
希望这可以帮助!