我想使用lambda表达式在集合中进行递减字符串排序,但我不知道为什么我会收到此错误:“错误C3497:您无法构造lambda的实例”。请有人帮帮我。
#include <set>
#include <iostream>
#include <iterator>
#include <string>
#include <functional>
using namespace std;
typedef set<string, greater<string> > DecreasingStringSet;
int main()
{
//lambda expression
auto comp = [](string x, string y){ return x > y; };
set< string , decltype(comp) > s(comp);
s.insert("one");
s.insert("two");
s.insert("three");
s.insert("four");
for (auto x : s){
cout << x << " ";
}
cout << endl;
return 0;
}
答案 0 :(得分:1)
如上面Manu所述,lambda的类型未指定。但是,您可以将其打包在std::function
:
set< string, std::function<int(string x, string y)>> s(comp);
顺便提一下,这种排序谓词应该1)具有const参数(因为你不应该修改在那种排序中被排序的项目)和2)如果它们是对象则应该是ref参数。作为正常值参数,你将进行大量不必要的复制,这会使事情效率低下。
请改用:
auto comp = [](const string& x, const string& y){ return x > y; };
set< string, std::function<int(const string& x, const string& y)>> s(comp);
答案 1 :(得分:0)
你已经有了解决方案:
using namespace std;
typedef set<string, greater<string> > DecreasingStringSet;
int main()
{
DecreasingStringSet s;
那就是它。见 Live ON Coliru
很多比lambda / std::function<>
方法更有效率,而且它会产生一个默认可构造的类。