12

这很奇怪..以下代码(感谢Cassio Neri我设法编译)正在编译没有任何错误..顺便说一下 hashing_func 和 key_equal_func 确实被调用了(控制台窗口中没有显示 couts )

#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,有什么提示可能是什么问题吗?

4

2 回答 2

19

您必须使用模板参数指定哈希/比较函数,而不是在构造函数中。这是一个例子:

class Hasher
{
public:
  size_t operator() (string const& key) const
  {
      cout << "Hashing called";
      size_t hash = 0;
      for(size_t i=0; i<key.size(); i++)
      {
          hash += (71*hash + key[i]) % 5;
      }
      return hash;
  }
};
class EqualFn
{
public:
  bool operator() (string const& t1, string const& t2) const
  {
    cout << "Equal called";
    return !(t1.compare(t2));
  }
};

unordered_map<string, string, Hasher, EqualFn> mymap(5);
于 2013-04-04T12:29:28.180 回答
8

问题是您需要将散列函数和 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;

这意味着如果你想传递 newHashKeyEqual函数,你必须告诉模板这些东西的类型。

链接不再可用(请求更新): 现场示例

于 2013-04-04T12:23:49.577 回答