Я пытаюсь создать unordered_map
для <xml_node*,string>
пары, где xml_node
является элементом XML из pugixml библиотеки, и я хочу, чтобы сохранить его указатель в качестве ключа. Я объявил карту, как это:unordered_map для <Pointer, String> в C++
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)’|
Теперь мне нужно сделать, чтобы реализовать хеш-функции и равные функции для карты? Я пытался реализовать их, как следует, но он не работает:
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++, так немного помощь будет здорово!
спасибо! отлично работал! другой запрос, как проверить, присутствует ли ключ (указатель здесь) в хеше или нет? Я попробовал указатель, который не находится в хеше, и привел к ошибке seg. –
@KoustuvSinha Проверьте изменения. – emlai
спасибо большое @zenith :) –