14

我经常看到这样的代码:

if(myQMap.contains("my key")){
    myValue = myQMap["my key"];
}

它理论上在 QMap 中执行两次查找。

我的第一反应是它应该被以下替换,它只执行一次查找并且应该快两倍:

auto it = myQMap.find("my key");
if(it != myQMap.end()){
    myValue = it.value();
}

我想知道 QMap 是否会自动为我进行此优化?换句话说,我想知道 QMap 是否保存找到的最后一个元素的位置QMap::contains()并在执行下一次查找之前先检查它?

4

2 回答 2

6

我希望 QMap 提供这两个函数,以便更好地访问该类。询问映射是否“包含”具有指定键的值比调用“查找”函数更自然。

如代码所示, find 和 contains 都调用以下内部函数:-

Node *n = d->findNode(akey);

所以如果你打算使用返回的迭代器,那么使用 find 并检查返回值会更有效,但如果你只是想知道该值是否存在于 map 中,调用 contains 会更好地提高可读性。

如果您查看源代码,您会发现 QMap 是作为节点的二叉树结构实现的。调用 findNode 遍历节点并且不缓存结果。

于 2013-11-14T09:32:19.450 回答
2

QMap源代码显示方法中没有特殊代码QMap::contains()

在某些情况下,您可以使用QMap::value()orQMap::values()获取键的值并检查它是否正确。这些方法(和 const operator[])将复制该值,尽管这对于大多数 Qt 类型来说可能是可以的,因为它们的底层数据是在写入时复制的(尤其是QMap它本身)。

于 2013-11-14T07:10:59.990 回答