2014-01-16 50 views
0

我正在尝试创建stringlistunordered_set对于std :: list,在C++ STL(std :: unordered_set)中没有散列函数?

但我坚持了这个错误:

/usr/include/c++/4.8/bits/hashtable_policy.h:1103:22: error: no match for call to ‘(const std::hash<std::list<std::basic_string<char> > >) (const std::list<std::basic_string<char> >&)’

我怀疑,这是因为STL不具备的stringlist的哈希函数。

创建相同类型的set工作,但我担心效率问题(插入和查找时间)。

对此有什么解决办法?我不想为列表实现哈希函数!但可能有人会建议我一些替代想法。

+2

正如你所说,没有定义散列函数。所以你不想通过定义一个散列函数来解决问题,并且你不想使用一个不需要的容器。那么,恩,你只是没有理由排除你的选择:) –

+1

[Boost](http://www.boost.org/doc/libs/1_55_0/doc/html/hash.html)支持标准容器。 – chris

+1

“我不想为列表实现散列函数!”为什么不?它不一定非常复杂。见http://www.boost.org/doc/libs/1_35_0/doc/html/hash/combine.html。如果你不想提升依赖,'hash_combine'的实现不会很长。 –

回答

0
class MyClass { 
private: 
    struct Hash : public std::unary_function< std::list<std::string> const& ls, 
                     size_t> { 
     std::size_t operator()(std::list<std::string> const& ls) const; 
    }; 
typedef boost::unordered_set< std::list<std::string>, Hash > MyClassSet; 
MyClassSet set_; 
}; 

std::size_t MyClass::Hash::operator()(std::list<std::string> const& ls) const { 
    std::size_t seed = 0; 
    std::list<std::string>::iterator it = ls.begin(); 
    while (it != ls.end()) { 
     boost::hash_combine(seed, *it); 
     ++it; 
    } 
    return seed; 
} 
相关问题