hashing_func
和都key_equal_fn
应该是函子对象(而不是函数)。另外,它们的类型必须提供给unordered_map
模板,即地图应该有这个类型:
unordered_map<string, string, hashing_func, key_equal_fn>
wherehashing_func
和key_equal_fn
是函子类:
struct hashing_func {
unsigned long operator()(const string& key) const {
unsigned long hash = 0;
for(size_t i=0; i<key.size(); i++)
hash += (71*hash + key[i]) % 5;
return hash;
}
};
struct key_equal_fn {
bool operator()(const string& t1, const string& t2) const {
return !(t1.compare(t2));
}
};
那么,mymap
是这样定义的:
typedef unordered_map<string, string, hashing_func, key_equal_fn> MapType;
MapType::size_type n = 5;
MapType mymap(n, hashing_func(), key_equal_fn());
或者,hashing_func
和/或key_equal_fn
可以是函数,但您必须将它们包装到std::function
对象中。那是,
unsigned long hashing_func(const string& key) {
unsigned long hash = 0;
for(size_t i=0; i<key.size(); i++)
hash += (71*hash + key[i]) % 5;
return hash;
}
bool key_equal_fn(const string& t1, const string& t2){
return !(t1.compare(t2));
}
并mymap
以这种方式定义
typedef unordered_map<string, string,
std::function<unsigned long(const string&)>,
std::function<bool(const string&, const string&)>> MapType;
MapType::size_type n = 5;
MapType mymap(n, hashing_func, key_equal_fn);
如果您愿意,可以使用 lambdas 并避免编写两个函数或仿函数类:
typedef unordered_map<string, string,
std::function<unsigned long(const string&)>,
std::function<bool(const string&, const string&)>> MapType;
MapType mymap(n,
[](const string& key) -> unsigned long {
unsigned long hash = 0;
for(size_t i=0; i<key.size(); i++)
hash += (71*hash + key[i]) % 5;
return hash;
},
[](const string& t1, const string& t2) {
return !(t1.compare(t2));
});
最后,我最喜欢的是全 lambdas解决方案
auto hashing_func = [](const string& key) -> unsigned long {
unsigned long hash = 0;
for(size_t i=0; i<key.size(); i++)
hash += (71*hash + key[i]) % 5;
return hash;
};
auto key_equal_fn = [](const string& t1, const string& t2) {
return !(t1.compare(t2));
};
typedef unordered_map<string, string,
decltype(hashing_func), decltype(key_equal_fn)> MapType;
MapType::size_type n = 5;
MapType mymap(n, hashing_func, key_equal_fn);