【问题标题】:No hash function in C++ STL (std::unordered_set) for std::list?C++ STL (std::unordered_set) 中没有用于 std::list 的哈希函数?
【发布时间】:2014-01-16 21:31:47
【问题描述】:

我正在尝试创建 unordered_setliststring

但我遇到了这个错误:

/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 没有 liststring 的哈希函数。

创建一个相同类型的set 是可行的,但我担心效率问题(插入和查找时间)。

有什么解决方法吗?我不想为列表实现哈希函数!但可能有人可以建议我一些替代的想法。

【问题讨论】:

  • 如你所说,没有定义散列函数。因此,您不想通过定义散列函数来解决问题,也不想使用不需要的容器。好吧,嗯,你只是无缘无故地排除了你的选择:)
  • Boost's 支持标准容器。
  • "我不想为列表实现哈希函数!"为什么不?它不必特别复杂。见boost.org/doc/libs/1_35_0/doc/html/hash/combine.html。如果你不想要 boost 依赖,hash_combine 的实现并不长。
  • 在最坏的情况下,我将不得不使用set。对于liststring,我想不出一个好的散列函数。
  • 这个answer 可能会对你有所帮助。

标签: c++ c++11 hash stl


【解决方案1】:
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;
}

【讨论】:

    猜你喜欢
    • 2020-03-26
    • 2011-03-24
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 2011-08-04
    • 2013-10-25
    相关资源
    最近更新 更多