[英]Using QString as the key in std::unordered_map
我正在尝试使用QString
作为std::unordered_map
的键,但是我收到错误消息:
错误 C2280:“std::hash<_Kty>::hash(const std::hash<_Kty> &)”:试图引用已删除的函数
我无法切换到QHash
因为地图的值类型是不可复制的。 有什么办法可以使这项工作?
将hash
实现放在标题中,并确保在使用地图的任何地方都包含该标题。
转发到qHash
简单实现应该就足够了:
#include <QHash>
#include <QString>
#include <functional>
namespace std {
template<> struct hash<QString> {
std::size_t operator()(const QString& s) const noexcept {
return (size_t) qHash(s);
}
};
}
尽管std::size_t
在常见的 64 位平台上比unsigned int
大,因此散列不会在其全长范围内改变 - 这不是问题。 该标准对std::hash
实现没有这样的要求。
问题是没有std::hash<QString>()
。 基于dbj2算法定义你自己的具有相当好的性能是很容易的:
#include <QString>
#include <unordered_map>
namespace std
{
template<> struct hash<QString>
{
std::size_t operator()(const QString& s) const noexcept
{
const QChar* str = s.data();
std::size_t hash = 5381;
for (int i = 0; i < s.size(); ++i)
hash = ((hash << 5) + hash) + ((str->row() << 8) | (str++)->cell());
return hash;
}
};
}
在std::unordered_map
使用QString
文件中包含它,错误就会消失。
似乎在较新版本的 Qt 中,为 QString 定义了 std::hash,因此您可以直接将其与 std::unordered_map 一起使用。 (它适用于我机器上的 Qt 5.14。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.