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

nbi*_*lal 10 c++ qt qmap

我经常看到如下代码:

if(myQMap.contains("my key")){
    myValue = myQMap["my key"];
}
Run Code Online (Sandbox Code Playgroud)

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

我的第一反应是它应该由以下代替,它只执行一次查找,应该快两倍:

auto it = myQMap.find("my key");
if(it != myQMap.end()){
    myValue = it.value();
}
Run Code Online (Sandbox Code Playgroud)

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

The*_*ght 5

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

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

Node *n = d->findNode(akey);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 真?!你在开玩笑,对吧?你想让我发布Qt代码,告诉你有什么不存在吗?另外,@ hluk的答案中的链接是源代码.单击它并按照函数调用. (2认同)