1

下面的代码定义了一个unordered_set. 代码编译得很好。但是在调用 find 时使用 lambda 函数而不是仿函数 throw:

libc++abi.dylib:终止调用抛出异常

#include <unordered_set>

class pair_hash {
    public:
        size_t operator() (const std::pair<int, int> &x) const {
            return std::hash<int>()(x.first) ^ std::hash<int>()(x.second);
        }
};

int main() {
    std::unordered_set<std::pair<int, int>, pair_hash> temp;
    temp.find(std::make_pair(0,0));


    std::function<std::size_t(std::pair<int , int>)> fpair_hash;
    fpair_hash = [](const std::pair<int, int>& v) -> std::size_t
    {
        return std::hash<int>()(v.first) ^ std::hash<int>()(v.second);
    };

    std::unordered_set<std::pair<int, int>, decltype(fpair_hash)> temp2;
    //why does this not work?
    temp2.find(std::make_pair(0,0));
    return 0;
}

clang++ -std=c++11 -stdlib=libc++ -o test test.cpp

4

1 回答 1

3

decltype(fpair_hash)所以std::function<std::size_t(std::pair<int , int>)>你只是用空哈希函数构建集合。

您需要向以下构造函数提供函数std::unordered_set

std::unordered_set<std::pair<int, int>, decltype(fpair_hash)> temp2(10, fpair_hash);

这应该可以使它工作,但是使用std::function会产生多态调用的开销,并且您可能不需要它:

auto fpair_hash = [](const std::pair<int, int>& v) -> std::size_t
{
    return std::hash<int>()(v.first) ^ std::hash<int>()(v.second);
};

最后,您的哈希函数不是很好 - 它会将所有对映射(x, x)0. 也许使用类似的东西x * 17 + y * 13代替x ^ y会减少碰撞的可能性。

于 2013-02-12T21:17:05.140 回答