unordered_map 对于 C++ 中的 <Pointer, String>
unordered_map for <Pointer, String> in C++
我正在尝试为 <xml_node*,string>
对创建一个 unordered_map
,其中 xml_node
是 pugixml 库中 xml 的一个元素,我希望将其指针存储为键。我已经这样声明了地图:
unordered_map<xml_node*,string> label_hash;
现在 insert
功能运行良好。但是每当我尝试 find
像这样的散列中的元素时:
string lb = string(label_hash.find(node));
我收到以下错误:
no matching function for call to ‘std::basic_string<char>::basic_string(std::_Hashtable<pugi::xml_node*, std::pair<pugi::xml_node* const, std::basic_string<char> >, std::allocator<std::pair<pugi::xml_node* const, std::basic_string<char> > >, std::_Select1st<std::pair<pugi::xml_node* const, std::basic_string<char> > >, std::equal_to<pugi::xml_node*>, std::hash<pugi::xml_node*>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, false, false, true>::iterator)’|
现在需要为map实现一个hash函数和equal函数吗?我试图按如下方式实现它们,但它不起作用:
struct hashing_func {
unsigned long operator()(const xml_node* key) const {
uintptr_t ad = (uintptr_t)key;
return (size_t)((13 * ad) ^ (ad >> 15));
//return hash<xml_node*>(key);
}
};
struct key_equal_fn {
bool operator()(const xml_node* t1, const xml_node* t2) const {
return (t1 == t2);
}
};
我对 C++ 有点陌生,所以如果有一点帮助就太好了!
请阅读文档:unordered_map::find
returns pair<xml_node const*, string>
的迭代器。 (您不能将其传递给 string
构造函数。)而是这样做:
auto iterator = label_hash.find(node);
if (iterator != label_hash.end()) { // `.find()` returns `.end()` if the key is not in the map
string& lb = iterator->second; // The `&` is optional here, use it if you don't want to deepcopy the whole string.
// use lb
}
else {
// key not in the map
}
我写了一个小测试程序:
#include <unordered_map>
#include <string>
namespace pugi
{
struct xml_node {};
}
int main()
{
std::unordered_map<pugi::xml_node*, std::string> mymap;
pugi::xml_node n1;
mymap.emplace(&n1, "foo");
auto i = mymap.find(&n1);
i->second;
return 0;
}
这编译完美,表明正如所怀疑的那样,问题不在于使用指针作为映射键,不是缺少自定义比较器,也不是缺少哈希函数。
unordered_map::找到 returns 一个迭代器 - 它指向 key/value 对。
我正在尝试为 <xml_node*,string>
对创建一个 unordered_map
,其中 xml_node
是 pugixml 库中 xml 的一个元素,我希望将其指针存储为键。我已经这样声明了地图:
unordered_map<xml_node*,string> label_hash;
现在 insert
功能运行良好。但是每当我尝试 find
像这样的散列中的元素时:
string lb = string(label_hash.find(node));
我收到以下错误:
no matching function for call to ‘std::basic_string<char>::basic_string(std::_Hashtable<pugi::xml_node*, std::pair<pugi::xml_node* const, std::basic_string<char> >, std::allocator<std::pair<pugi::xml_node* const, std::basic_string<char> > >, std::_Select1st<std::pair<pugi::xml_node* const, std::basic_string<char> > >, std::equal_to<pugi::xml_node*>, std::hash<pugi::xml_node*>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, false, false, true>::iterator)’|
现在需要为map实现一个hash函数和equal函数吗?我试图按如下方式实现它们,但它不起作用:
struct hashing_func {
unsigned long operator()(const xml_node* key) const {
uintptr_t ad = (uintptr_t)key;
return (size_t)((13 * ad) ^ (ad >> 15));
//return hash<xml_node*>(key);
}
};
struct key_equal_fn {
bool operator()(const xml_node* t1, const xml_node* t2) const {
return (t1 == t2);
}
};
我对 C++ 有点陌生,所以如果有一点帮助就太好了!
请阅读文档:unordered_map::find
returns pair<xml_node const*, string>
的迭代器。 (您不能将其传递给 string
构造函数。)而是这样做:
auto iterator = label_hash.find(node);
if (iterator != label_hash.end()) { // `.find()` returns `.end()` if the key is not in the map
string& lb = iterator->second; // The `&` is optional here, use it if you don't want to deepcopy the whole string.
// use lb
}
else {
// key not in the map
}
我写了一个小测试程序:
#include <unordered_map>
#include <string>
namespace pugi
{
struct xml_node {};
}
int main()
{
std::unordered_map<pugi::xml_node*, std::string> mymap;
pugi::xml_node n1;
mymap.emplace(&n1, "foo");
auto i = mymap.find(&n1);
i->second;
return 0;
}
这编译完美,表明正如所怀疑的那样,问题不在于使用指针作为映射键,不是缺少自定义比较器,也不是缺少哈希函数。
unordered_map::找到 returns 一个迭代器 - 它指向 key/value 对。