在c ++中将参数传递给unordered_set散列函数的语法

时间:2017-01-13 19:18:56

标签: c++ syntax clang++ unordered-set

我为自定义类型I使用创建了一个hasher类,但它有一个带参数的构造函数。我无法弄清楚在unordered_set中使用它的语法。

class Hasher {
    unsigned arg;
public:
    Hasher(unsigned a) : arg(a) {}
    size_t operator()(const MyType& t) const {
        return calculate_hash(arg, t);
    }
}

int main() {
    unordered_set<MyType, Hasher(2)> myset; // compilation error
}

错误消息:

In file included from Tetrahedron.cc:5:
./Triangulation.h:52:29: error: template argument for template type parameter must be a type
       unordered_set<TetraFace,FaceHasher(2)> faces2;
                               ^~~~~~~~~~~~~
/bin/../lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/unordered_set.h:90:11: note: template parameter is declared here
       class _Hash = hash<_Value>,
             ^

我也试过

unordered_set<MyType, Hasher> myset(Hasher(2));

但我仍然收到错误:

In file included from Tetrahedron.cc:5:
./Triangulation.h:52:59: error: expected ')'
    unordered_set<TetraFace,FaceHasher> faces2(FaceHasher(2));
                                                          ^
./Triangulation.h:52:58: note: to match this '('
unordered_set<TetraFace,FaceHasher> faces2(FaceHasher(2));
                                                     ^

2 个答案:

答案 0 :(得分:2)

您在那里收到编译错误,因为您正在尝试将Hasher类型的对象(即实例)作为模板参数传递。

就像您的错误描述:template argument for template type parameter must be a type

它期待一种类型,并且你传递了一个值。

在类型级别参数化arg。

template<unsigned A>
class Hasher {
    unsigned arg = A;
public:
    size_t operator()(const int& t) const {
        std::cout << arg << std::endl;
        return 0;
    }
};

int main() {
    std::unordered_set<int, Hasher<2>> myset;
    myset.insert(5); // prints 2

    std::unordered_set<int, Hasher<3>> myset2;
    myset2.insert(3); // prints 3
}

答案 1 :(得分:0)

不幸的是,仅使用哈希对象构造std::unorderd_set是不可能的。获取哈希对象的All of the constructorsbucket_count之前有一个参数。您需要为其指定值,如

unordered_set<MyType, Hasher> myset(some_bucket_count_value, Hasher(2));

如果您不想这样做,那么您必须使Hasher默认可构造。

也不是那个

return calculate_hash(arg);

不管怎么办,因为无论你通过什么arg,你总是会哈希MyType。您需要对MyType对象进行哈希处理才能使std::unordered_set真正起作用。