C++ STL (std::unordered_set) 中没有用于 std::list 的哈希函数
No hash function in C++ STL (std::unordered_set) for std::list?
我正在尝试创建一个string
list
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 没有用于string
list
的哈希函数。
创建相同类型的set
有效,但我担心效率问题(插入和查找时间)。
有什么解决方法吗?我不想为列表实现哈希函数!但也许有人可以向我提出一些替代想法。
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;
}
相关文章:
- 将fold表达式与std::一起用于两个元组
- std::ranges::elements_view,用于自定义类似元组的数据
- 专用于 std 元组的模板,而无需用户执行remove_cvref
- 为什么 std::lerp 不适用于任何已实现所需操作的类型?
- std::byte 指针应该用于指针算术吗?
- 使用 std::应用于 std::bind
- 迭代器库中的 std::size() 不适用于传递给函数的 C 样式数组
- 重载 std::字符串运算符+ 用于打印枚举名称
- 运算符 += 应用于 std::valarray<int*>
- 为什么这个分配器不适用于"std::allocate_shared"?奇怪的模板替换错误
- std::list 可以用于简单的无锁队列吗?
- 无法获得等效的 std::less 来用于嵌套迭代器
- 为什么 std::erase(std::erase_if) 不是适用于<algorithm>任何容器的模板?
- 隐式转换为比较函数对象(函子)用于 std::sort 而不是 std::map?
- C++11 基于范围的 for 循环,用于 std::list
- 用于从 ANSI 字符串转换为 std::basic_string <TCHAR>的正确函数声明
- 函数可以应用于 std::optional,并返回一个可选值吗?
- std::is_invocable 用于测试任意方法是否存在的语法(不仅是运算符())
- std::tuple 的自定义哈希不适用于unordered_set
- std::用于处理短字符串的字符串性能