我有混合的C和C++文件,它们共同构成了我的程序.我正在使用boost无序哈希映射,我最初定义为:
typedef boost::unordered_map<char *, int> my_map;
Run Code Online (Sandbox Code Playgroud)
然而,地图表现得很奇怪; find(key)找不到哈希映射中实际存在的键.然后,我将定义更改为:
typedef boost::unordered_map<std::string, int> my_map;
Run Code Online (Sandbox Code Playgroud)
现在哈希映射工作正常.然而,为了使用地图,我将char*转换为std :: string是不方便的.有没有办法让第一个定义有效?
std::unordered_map哦啊哈.注意到你想要的unordered_map.我最喜欢的一个是用来boost::string_ref表示字符串而不复制,所以你可以这样做
std::unordered_map<boost::string_ref, int> map;
Run Code Online (Sandbox Code Playgroud)
使用快速和脏的哈希实现,如:
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());
}
};
}
Run Code Online (Sandbox Code Playgroud)
std::map您可以使用自定义比较器:
std::map<char const*, int, std::less<std::string> > map;
Run Code Online (Sandbox Code Playgroud)
请注意,这是非常低效的,但它显示了方式.
更高效的是包装/使用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;
}
};
Run Code Online (Sandbox Code Playgroud)
然后
std::map<char const*, int, less_sz> map;
Run Code Online (Sandbox Code Playgroud)