C ++中<pointer,string =“”>的unordered_map

时间:2016-04-12 09:02:13

标签: c++ xml dictionary unordered-map pugixml

我正在尝试为unordered_map对创建<xml_node*,string>,其中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)’|

现在我需要为地图实现哈希函数和相等的函数吗?我试图像下面这样实现它们,但它不起作用:

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 ++有点新意,所以一点帮助就会很棒!

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分: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返回一个迭代器 - 它指向一个键/值对。