首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QMap::contains() VS QMap::find()

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

Stack Overflow用户
提问于 2013-11-14 05:59:41
回答 2查看 15.3K关注 0票数 14

我经常看到这样的代码:

代码语言:javascript
复制
if(myQMap.contains("my key")){
    myValue = myQMap["my key"];
}

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

我的第一反应是,它应该被替换为以下代码,它只执行一次查找,速度应该是原来的两倍:

代码语言:javascript
复制
auto it = myQMap.find("my key");
if(it != myQMap.end()){
    myValue = it.value();
}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-14 17:32:19

我希望QMap同时提供这两个函数,以便为类提供更好的接口。与调用“find”函数相比,询问map是否“包含”具有指定键的值更为自然。

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

代码语言:javascript
复制
Node *n = d->findNode(akey);

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

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

票数 6
EN

Stack Overflow用户

发布于 2013-11-14 15:11:00

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19965264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档