2016-04-12 12 views
0

Я пытаюсь создать 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++, так немного помощь будет здорово!

ответ

5

Прочтите документацию: unordered_map::find возвращает итератор на 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 
} 
+0

спасибо! отлично работал! другой запрос, как проверить, присутствует ли ключ (указатель здесь) в хеше или нет? Я попробовал указатель, который не находится в хеше, и привел к ошибке seg. –

+0

@KoustuvSinha Проверьте изменения. – emlai

+0

спасибо большое @zenith :) –

1

Я написал небольшую тестовую программу:

#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 :: find возвращает итератор - который указывает на пару ключ/значение.

+0

спасибо! поэтому i-> сначала дает ключ, а i-> second дает значение правильно? –

+0

@ KoustuvSinha абсолютно прав. –

 Смежные вопросы

  • Нет связанных вопросов^_^