微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在没有内存分配的情况下在 QHash<QString, DataType> 中搜索 QStringView?

如何解决在没有内存分配的情况下在 QHash<QString, DataType> 中搜索 QStringView?

在解析文本数据后,我得到了 QStringView。 我需要搜索它是否存在于 QHash<QString,DataType> 类型的变量中。 如果没有 QStringViewQString 的对话,是否有可能? 换句话说,可以不分配吗?

我可以使用其他类似于 Qt 功能QHash 类型吗?

解决方法

有一种称为“透明映射”的技术,std::map 但不支持 std::unordered_mapQHash。透明映射允许使用非键类型来查找元素,只要它们支持 == 并且它们等效地散列。

由于 QHash 不支持您遇到麻烦。

没有 QString 构造函数允许它不将字节复制到 QString 中。

您可以将 QHash 更改为不同类型的地图。由于它不透明,因此该类型必须在运行时知道它是否拥有。

在非 Qt C++ 中我可能会这样做

using stringish = std::variant<std::string,std::string_view>;

然后实现一个哈希函数和相等性来进行适当的交叉类型检查。

然后

std::unordered_map<stringish,DataType,myHash,myEqual> bob

将支持 bob.find(""sv) 而不必将字符串视图移动到字符串中。

类似的技术应该适用于 QHash

人们甚至可以更进一步编写 QTransparentKey<T>,它存储 T 或实现 ==hash 的函数指针在 T 兼容大大地。然后抛出一个类型擦除构造函数。

有了这个,你就可以了

QHash<QTransparentKey<QString>,DataType>

注意不要使用实际的字符串视图创建键条目,这很容易做到并导致段错误。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。