繁体   English   中英

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

[英]QMap::contains() VS QMap::find()

我经常看到这样的代码:

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

我希望QMap同时提供这两种功能,以实现与类的更好接口。 询问映射是否“包含”具有指定键的值比调用“查找”功能更自然。

如代码所示,查找和包含都调用以下内部函数:-

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM