2013-03-24 106 views
0

假设我用我自己的类作为键std::unordered_map例如需要的std :: unordered_map构造

class MyClass { 
public: 
    int a, b; 
} 

www.cplusplus.com列出了下面的构造函数可用于:

explicit unordered_map (size_type n, 
         const hasher& hf = hasher(), 
         const key_equal& eql = key_equal(), 
         const allocator_type& alloc = allocator_type()); 

你能不能给一个例子,我可以如何使用上述构造函数的所有参数填充构造我的std::unordered_map<MyClass, std::string>

+2

【这里这个例子(http://en.cppreference.com/w/cpp/container/unordered_map/unordered_map)应该给你一个好主意什么是必须的。 – juanchopanza 2013-03-24 17:23:13

+0

@juanchopanza我明白哈希和key_equal函数可以被指定为模板的一部分。但是,他们可以直接传递给构造函数,而无需在模板中指定它们?如果是这样,怎么样? – 2013-03-24 17:34:44

+0

您只需将函数的实例传递给构造函数。特定的位置取决于你所调用的构造函数。 – juanchopanza 2013-03-24 17:36:47

回答

2

three std::unordered_map constructors作为参数的散列和平等仿函数的实例。这个例子说明如何使用其中的一种:

struct MyHash { 
    std::size_t operator()(const MyClass& k) const { .... } 
}; 

struct MyEqual { 
    bool operator()(const MyClass& lhs, const MyClass& rhs) const { .... } 
}; 

std::unordered_map<MyClass, std::string, MyHash, MyEqual> m(42, // bucket count 
                  MyHash(), 
                  MyEqual()); 
+0

获取以下编译错误:''bool MyEqual :: operator ==(const MyClass&,const MyClass&)'必须使用gcc只需要一个参数'4.7.2 – 2013-03-24 17:47:21

+0

@VictorLyuboslavsky好的,我在代码中发现错误。我在MyEqual类中犯了一个愚蠢的错误。现在它应该编译。 – juanchopanza 2013-03-24 18:41:50

0

编写一个能够在unordered_map中用作键的类不是免费的,它们需要一个自定义的散列对象。

struct MyHash { 
    std::size_t operator()(const MyClass& k) const 
    { 
    // You may want to use a better hash function 
    return static_cast<std::size_t>(k.a)^static_cast<std::size_t>(k.b); 
    } 
}; 

然后,通过哈希函数映射作为模板参数(其构造具有默认的构造函数哈希对象,所以你不需要手动传递):

std::unordered_map<MyClass, std::string, MyHash> m; 

或者,您可以在std命名空间中提供散列函数。现在

namespace std { 
    template <> 
    struct hash<MyClass> { 
    std::size_t operator()(const MyClass& k) const; // same as before 
    }; 
} 

,这正是预期:

std::unordered_map<MyClass, std::string> m; 

除了特殊要求unordered_map,你还需要定义一个operator==。 即使这也可以通过模板参数进行定制,我建议将其作为全局函数编写。

+0

它仍然需要相等比较函数,或者'operator ==(const MyClass&lhs,const MyClass&rhs)'。 – juanchopanza 2013-03-24 17:32:39

相关问题