我有混合的C和C ++文件,这些文件共同组成了我的程序。我正在使用boost无序哈希映射,我最初定义为:
typedef boost::unordered_map<char *, int> my_map;
然而,地图表现得很奇怪; find(key)找不到哈希映射中实际存在的密钥。然后,我将定义更改为:
typedef boost::unordered_map<std::string, int> my_map;
现在哈希映射工作正常。然而,为了使用地图,我将char *转换为std :: string是不方便的。有没有办法让第一个定义有效?
答案 0 :(得分:6)
std::unordered_map
unordered_map
。我最喜欢的一个是使用boost::string_ref
代表字符串而不复制,所以你可以做
std::unordered_map<boost::string_ref, int> map;
快速&amp;脏哈希实现如:
namespace std
{
template<>
struct hash<boost::string_ref> {
size_t operator()(boost::string_ref const& sr) const {
return boost::hash_range(sr.begin(), sr.end());
}
};
}
std::map
您可以使用自定义比较器:
std::map<char const*, int, std::less<std::string> > map;
请注意,这是非常低效的,但它显示了方式。
更高效的是包装/使用strcmp
:
#include <cstring>
struct less_sz
{
bool operator()(const char* a, const char* b) const
{
if (!(a && b))
return a < b;
else
return strcmp(a, b) < 0;
}
};
然后
std::map<char const*, int, less_sz> map;