c – unordered_map与自定义哈希/相等的功能 – 函数不被调用

前端之家收集整理的这篇文章主要介绍了c – unordered_map与自定义哈希/相等的功能 – 函数不被调用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这个问题在这里已经有一个答案:> unordered_map constructor error (equal_to templated function)1
这是奇怪的..以下代码(我设法编译感谢 Cassio Neri)正在编译没有任何错误..通过hashing_func和key_equal_func被调用的方式(在控制台窗口中没有显示粗体)
#include <iostream>
#include <string>
#include <unordered_map>
#include <algorithm>
#include <functional>

using namespace std;

unsigned long hashing_func(string key)
{
    cout << "Hashing called";
    unsigned long hash = 0;
    for(int i=0; i<key.size(); i++)
    {
        hash += (71*hash + key[i]) % 5;
    }
    return hash;
}

template<class T> bool key_equal_fn(T t1,T t2)
{
    return t1 == t2;
}

template <> bool key_equal_fn<string>(string t1,string t2)
{
    cout << "Equal called";
    return !(t1.compare(t2));
}

int main ()
{
    unordered_map<string,string>::size_type n = 5;
    unordered_map<string,string> mymap(n,(const std::hash<string> &)hashing_func,(const std::equal_to<string> &)(function<bool(string,string)>(key_equal_fn<string>))) ;

    bool case_insensitive = mymap.key_eq()("test","TEST");

    mymap["paul"] = "jenna";
    mymap["frank"] = "ashley";

    if(mymap["paul"] == mymap["frank"])
        cout << "equal" << endl;


    return 0;
}

我正在使用MSVC2012,任何提示可能是什么问题?

@H_404_7@

解决方法

问题是您需要将hash函数和hash_key_equal函数的类型传递给unordered_map,然后将实际函数传递给映射的ctor.

您的unordered_map定义应如下所示:

unordered_map<
    std::string,std::string,std::function<unsigned long(std::string)>,std::function<bool(std::string,std::string)>
> mymap(n,hashing_func,key_equal_fn<std::string>);

unordered_map是一个模板,它看起来像这样:

template<
    class Key,class T,class Hash = std::hash<Key>,class KeyEqual = std::equal_to<Key>,class Allocator = std::allocator<std::pair<const Key,T>>
> class unordered_map;

这意味着如果你想传递新的Hash和KeyEqual函数,你必须告诉模板这些东西的类型.

链接不能访问(请求更新):
Live Example

@H_404_7@ @H_404_7@

猜你在找的C&C++相关文章