【问题标题】:Choosing the right datastructure with QPair and QString使用 QPair 和 QString 选择正确的数据结构
【发布时间】:2012-08-16 06:49:35
【问题描述】:

我想存储一个 QPair 和 QString,或者换句话说,我想为每个索引存储三个值(int、int、String)。为此,我选择了一个 QMap,它运行良好,其中 QString 作为键,QPair 作为值。

到目前为止,我只遍历了 QMap,但是当我想查找其中一个键(QString)时,问题就出现了。当我使用myQMap.key(myQPair) 时,返回的字符串是空白的(我知道我想要的字符串不是空白的)。

所以问题是如何仅使用 QPair 作为参数来查找 QString? QPair 可以作为关键吗?据我了解,这是行不通的。

【问题讨论】:

  • 您的代码有错误。虽然它会很慢,但 QMap 应该能够很好地进行反向查找。您为QMap::key 描述的行为仅在以下情况下才会发生:1. 您没有具有 myQPair 值的键值对,或 2. 您错误地插入了一个带有空白字符串的键值对键和 myQPair 的值。
  • 嗯,好的。我会调试一下看看。但只是为了澄清;是否可以使用 QPair 作为值/键来查找 QString?
  • 是的,有可能。为 QString 和 QPair 定义了作为键的所有必要运算符。 QMap 的限制是值到键的查找将花费线性时间(比键到值查找的 log(n) 慢得多)。因此,如果您需要在两个方向上快速查找,则需要不同的数据结构。
  • 因此,建议数据结构发生变化的答案是正确的。然而,促使你切换这些东西的问题不是它太慢,而是你的尝试根本没有奏效。这表明您在所描述的代码中做错了什么(因为您所描述的应该起作用)。
  • 是的,你是对的。我用作论据的时间对是错误的。谢谢!

标签: c++ qt


【解决方案1】:

听起来你想要一个像地图一样双向工作的数据结构;您想使用QString 作为键来查找QPair<int,int>,并且您想使用QPair<int,int> 作为键来查找QString

Qt 中没有提供此功能的类。所以要么你必须自己实现这个(有很多方法),或者你可以使用boost::bimap

【讨论】:

    【解决方案2】:

    没有std::map 之类的对象可以使用该值作为键,这违背了它的目的。

    您需要的是boost::bimap (docs)。

    【讨论】:

    • 但是这个人正在使用 Qt。
    • @Bruce 并且 Qt 不支持该功能。 Boost::bimap 只是带​​有极其宽松许可证的标题,有理由不使用它。
    【解决方案3】:

    我通过创建两张地图解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-10
      • 1970-01-01
      相关资源
      最近更新 更多