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

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;

Hashつまり、 newとfunctionsを渡したい場合はKeyEqual、これらの型をテンプレートに伝える必要があります。

リンクにアクセスできなくなりました (更新のリクエスト): 実際の例

于 2013-04-04T12:23:49.577 に答える