我经常看到如下代码:
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()
找到的最后一个元素的位置,并在执行下一次查找之前先检查它?
答案 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
本身)。