![](/img/trans.png)
[英]QMap::contains() and QMap::value() does not find existing key-value pair
[英]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.