![](/img/trans.png)
[英]efficient way to search in `QMap<QString, ...>` using `QStringView`
[英]search QStringView in QHash<QString, DataType> without memory allocation?
解析文本数据后,我得到了QStringView
。 我需要搜索它是否存在于QHash<QString, DataType>
类型的变量中。 没有QStringView
到QString
的对话是否有可能,换句话说,是否有可能没有分配?
我可以使用类似于QHash
功能的其他Qt
类型吗?
std::map
有一种称为“透明映射”的技术,但std::unordered_map
或QHash
支持。 透明的 map 允许使用非键类型来查找元素,只要它们支持==
并且它们等效地支持 hash。
由于QHash
不支持您遇到麻烦。
没有QString
构造函数允许它不将字节复制到QString
中。
您可以将QHash
更改为不同类型的 map。 由于它不透明,因此该类型必须在运行时知道它是否拥有。
在非 Qt C++ 我可能会做
using stringish = std::variant<std::string, std::string_view>;
然后实现一个 hash function 和进行正确交叉类型检查的相等性。
然后
std::unordered_map<stringish, DataType, myHash, myEqual> bob
将支持bob.find(""sv)
而无需将字符串视图移动到字符串中。
类似的技术应该适用于QHash
。
甚至可以进一步 go 并编写QTransparentKey<T>
,它以T
兼容的方式存储T
或 function 指针,实现==
和hash
。 然后抛出一个类型擦除构造函数。
有了它,你可以拥有
QHash<QTransparentKey<QString>, DataType>
请注意不要使用实际的字符串视图创建键条目,这很容易做到并导致段错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.