在没有内存分配的情况下在 QHash<QString, DataType> 中搜索 QStringView?
search QStringView in QHash<QString, DataType> without memory allocation?
解析文本数据后得到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
或在 T
中实现 ==
和 hash
的函数指针- 兼容的方式。然后抛出一个类型擦除构造函数。
有了它,你就可以拥有
QHash<QTransparentKey<QString>, DataType>
请注意不要使用实际的字符串视图创建键条目,这很容易做到并导致段错误。
解析文本数据后得到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
或在 T
中实现 ==
和 hash
的函数指针- 兼容的方式。然后抛出一个类型擦除构造函数。
有了它,你就可以拥有
QHash<QTransparentKey<QString>, DataType>
请注意不要使用实际的字符串视图创建键条目,这很容易做到并导致段错误。