这很奇怪..下面的代码(由于Cassio Neri我设法编译)正在编译而没有任何错误..顺便说一下,哈希_func和key_equal_func都被调用(couts没有显示在控制台窗口)
#include <iostream>
#include <string>
#include <unordered_map>
#include <algorithm>
#include <functional>
using namespace std;
unsigned long hashing_func(string key)
{
cout << "Hashing called";
unsigned long hash = 0;
for(int i=0; i<key.size(); i++)
{
hash += (71*hash + key[i]) % 5;
}
return hash;
}
template<class T> bool key_equal_fn(T t1, T t2)
{
return t1 == t2;
}
template <> bool key_equal_fn<string>(string t1, string t2)
{
cout << "Equal called";
return !(t1.compare(t2));
}
int main ()
{
unordered_map<string, string>::size_type n = 5;
unordered_map<string, string> mymap(n, (const std::hash<string> &)hashing_func,
(const std::equal_to<string> &)(function<bool(string,string)>(key_equal_fn<string>))) ;
bool case_insensitive = mymap.key_eq()("test","TEST");
mymap["paul"] = "jenna";
mymap["frank"] = "ashley";
if(mymap["paul"] == mymap["frank"])
cout << "equal" << endl;
return 0;
}
我正在使用MSVC2012,任何暗示可能是什么问题?
答案 0 :(得分:15)
您必须使用模板参数指定哈希/比较函数,而不是在构造函数中。这是一个例子:
class Hasher
{
public:
size_t operator() (string const& key) const
{
cout << "Hashing called";
size_t hash = 0;
for(size_t i=0; i<key.size(); i++)
{
hash += (71*hash + key[i]) % 5;
}
return hash;
}
};
class EqualFn
{
public:
bool operator() (string const& t1, string const& t2) const
{
cout << "Equal called";
return !(t1.compare(t2));
}
};
unordered_map<string, string, Hasher, EqualFn> mymap(5);
答案 1 :(得分:8)
问题是你需要将hash函数和hash_key_equal函数的类型传递给unordered_map,然后将实际函数传递给map的ctor。
您的unordered_map定义应如下所示:
unordered_map<
std::string,
std::string,
std::function<unsigned long(std::string)>,
std::function<bool(std::string, std::string)>
> mymap(n, hashing_func, key_equal_fn<std::string>);
unordered_map
是一个模板,它看起来像这样:
template<
class Key,
class T,
class Hash = std::hash<Key>,
class KeyEqual = std::equal_to<Key>,
class Allocator = std::allocator<std::pair<const Key, T>>
> class unordered_map;
这意味着如果您想要传递新的Hash
和KeyEqual
函数,您必须告诉模板这些东西的类型。
不再可以访问链接(请求更新): Live Example