【发布时间】:2021-06-26 14:59:14
【问题描述】:
解析文本数据后,我得到了QStringView。
我需要搜索它是否存在于QHash<QString, DataType> 类型的变量中。
没有QStringView 到QString 的对话是否可能,
换句话说,是否可以不分配?
我可以为此使用类似于QHash 功能的其他Qt 类型吗?
【问题讨论】:
解析文本数据后,我得到了QStringView。
我需要搜索它是否存在于QHash<QString, DataType> 类型的变量中。
没有QStringView 到QString 的对话是否可能,
换句话说,是否可以不分配?
我可以为此使用类似于QHash 功能的其他Qt 类型吗?
【问题讨论】:
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 或以T 兼容的方式实现== 和hash 的函数指针。然后抛出一个类型擦除构造函数。
有了它,你就可以拥有
QHash<QTransparentKey<QString>, DataType>
请注意不要使用实际的字符串视图创建键条目,这很容易做到并导致段错误。
【讨论】: