QMap :: contains()VS QMap :: find()

时间:2013-11-13 21:59:41

标签: c++ qt qmap

我经常看到如下代码:

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()找到的最后一个元素的位置,并在执行下一次查找之前先检查它?

2 个答案:

答案 0 :(得分:5)

我希望QMap提供两种功能,以便更好地与类接口。询问地图'包含'具有指定键的值是否比调用'find'函数更自然。

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

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

因此,如果您要使用返回的迭代器,那么使用find并检查返回值将更有效,但如果您只想知道映射中是否存在该值,则调用contains更易于提高可读性。

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

答案 1 :(得分:2)

QMap源代码显示QMap::contains()方法中有no special code

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