用lambda创建unordered_set [英] creating unordered_set with lambda

查看:106
本文介绍了用lambda创建unordered_set的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何用lambda制作unordered_set? (我知道如何使用用户定义的哈希结构和operator==做到这一点)

How can I make unordered_set with lambda? (I know how to make it with user defined hash struct and operator==)

我当前的代码是:

#include <unordered_set>
#include <functional>

struct Point
{
    float x;
    float y;
    Point() : x(0), y(0) {}
};

int main()
{
    auto hash=[](const Point& pt){
        return (size_t)(pt.x*100 + pt.y);
    };
    auto hashFunc=[&hash](){
        return  std::function<size_t(const Point&)> (hash);
    };
    auto equal=[](const Point& pt1, const Point& pt2){
        return ((pt1.x == pt2.x) && (pt1.y == pt2.y));
    };
    auto equalFunc=[&equal](){
        return std::function<size_t(const Point&,const Point&)> (equal);
    };
    using PointHash=std::unordered_set<Point,decltype(hashFunc),decltype(equalFunc)>;

    PointHash Test(10,hashFunc,equalFunc);

    return 0;
}

它给我很少!错误数(实时):

It give me few! number of errors (live):

请注意,我将lambda用作返回std::function(equalFunchashFunc)的原因,因为似乎在unordered_set中,某些函数正在尝试复制该lambda的返回类型!

Note that I make a lambda for returning std::function (equalFunc,hashFunc) because it seems that in unordered_set some functions are trying to copy return type of that lambdas !

gcc 4.8编译好的代码也很奇怪! (实时)

Also it's weird that gcc 4.8 compile that code fine ! ( live )

推荐答案

您的代码中无需std::function抽象.只需直接通过decltype获取unordered_set模板参数的lambda类型

There's no need for the std::function abstraction in your code. Just obtain the lambda types directly via decltype for unordered_set's template arguments

auto hash=[](const Point& pt){
    return (size_t)(pt.x*100 + pt.y);
};

auto equal=[](const Point& pt1, const Point& pt2){
    return ((pt1.x == pt2.x) && (pt1.y == pt2.y));
};

using PointHash = std::unordered_set<Point, decltype(hash), decltype(equal)>;

PointHash Test(10, hash, equal);


在您只是简单地对两个结构进行逐元素比较的地方,我发现更容易使用std::tie代替

auto equal=[](const Point& pt1, const Point& pt2){
    return std::tie(pt1.x, pt1.y) == std::tie(pt2.x, pt2.y);
};


由于


The above code compiles on both gcc and clang, but not on VS2013 because of this bug. The VS standard library implementation tries to default construct the lambda type somewhere, which is going to fail because the default constructor is deleted. std::function can be used as a workaround for VS2013, but I'd stick to defining a struct with an overloaded operator() instead.

这篇关于用lambda创建unordered_set的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆