【问题标题】:search QStringView in QHash<QString, DataType> without memory allocation?在没有内存分配的情况下在 QHash<QString, DataType> 中搜索 QStringView?
【发布时间】:2021-06-26 14:59:14
【问题描述】:

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

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

【问题讨论】:

    标签: c++ qt qt5 qstring


    【解决方案1】:

    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&lt;T&gt;,它存储T 或以T 兼容的方式实现== 和hash 的函数指针。然后抛出一个类型擦除构造函数。

    有了它,你就可以拥有

    QHash<QTransparentKey<QString>, DataType>
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-28
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      相关资源
      最近更新 更多