如何解决在没有内存分配的情况下在 QHash<QString, DataType> 中搜索 QStringView?
在解析文本数据后,我得到了 QStringView
。
我需要搜索它是否存在于 QHash<QString,DataType>
类型的变量中。
如果没有 QStringView
到 QString
的对话,是否有可能?
换句话说,可以不分配吗?
我可以使用其他类似于 Qt
功能的 QHash
类型吗?
解决方法
有一种称为“透明映射”的技术,std::map
但不支持 std::unordered_map
或 QHash
。透明映射允许使用非键类型来查找元素,只要它们支持 ==
并且它们等效地散列。
由于 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 举报,一经查实,本站将立刻删除。