使用lambda创建一个按递减顺序设置的字符串

时间:2014-05-15 21:17:10

标签: c++ lambda

我想使用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;
}

2 个答案:

答案 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<>方法更有效率,而且它会产生一个默认可构造的类。