C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了C++ map(STL map)operator[]和insert()效率对比(深度剖析)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
通过前面的学习我们知道,map 容器模板类中提供有 operator[ ] 和 insert() 这 2 个成员方法,而值得一提的是,这 2 个方法有相同的功能,它们既可以实现向 map 容器中添加新的键值对元素,也可以实现更新(修改)map 容器已存储键值对的值。

举个例子(程序一):
#include <iostream>
#include <map>  //map
#include <String> //String
using namespace std;
int main()
{
    std::map<String,String> mymap;
    //借用 operator[] 添加新键值对
    mymap["STL教程"] = "http://c.biancheng.net/java/";
    cout << "old mymap:" << mymap["STL教程"] << endl;
    //借用 operator[] 更新某个键对应的值
    mymap["STL教程"] = "http://c.biancheng.net/stl/";
    cout << "new mymap:" << mymap["STL教程"] << endl;

    //借用insert()添加新键值对
    std::pair<String,String> STL = { "Java教程","http://c.biancheng.net/python/" };
    std::pair<std::map<String,String>::iterator,bool> ret;
    ret = mymap.insert(STL);
    cout << "old ret.iter = <{" << ret.first->first << "," << ret.first->second << "}," << ret.second << ">" << endl;
    //借用 insert() 更新键值对
    mymap.insert(STL).first->second = "http://c.biancheng.net/java/";
    cout << "new ret.iter = <" << ret.first->first << "," << ret.first->second << ">" << endl;
    return 0;
}
程序执行结果为:

old mymap:http://c.biancheng.net/java/
new mymap:http://c.biancheng.net/stl/
old ret.iter = <{Java教程,http://c.biancheng.net/python/},1>
new ret.iter = <Java教程,http://c.biancheng.net/java/>

显然,map 模板类中 operator[ ] 和 insert()功能发生了重叠,这就产生了一个问题,谁的执行效率更高呢?

总的来说,读者可记住这样一条结论:当实现“向 map 容器中添加新键值对元素”的操作时,insert() 成员方法的执行效率更高;而在实现“更新 map 容器指定键值对的值”的操作时,operator[ ] 的效率更高。

至于为什么,有兴趣的读者可继续往下阅读。

向map容器中增添元素,insert()效率更高

首先解释一下,为什么实现向 map 容器中添加新键值对元素,insert() 方法的执行效率比 operator[ ] 更高?回顾程序一中,如下语句完成了向空 mymap 容器添加新的键值对元素:
mymap["STL教程"] = "http://c.biancheng.net/java/";
此行代码中,mymap["STL教程"] 实际上是 mymap.operator[ ](“STL教程”) 的缩写(底层调用的 operator[ ] 方法),该方法会返回一个指向 “STL教程” 对应的 value 值的引用。

需要注意的是,由于此时 mymap 容器是空的,并没有 "STL教程" 对应的 value 值。这种情况下,operator[ ] 方法认构造一个 String 对象,并将其作为 "STL教程" 对应的 value 值,然后返回一个指向此 String 对象的引用。在此基础上,代码还会将 "http://c.biancheng.net.java/" 赋值给这个 String 对象。

也就是说,上面这行代码的执行流程,可以等效为如下程序:
typedef map<String,String> mstr;
//创建添加认键值对元素
pair<mstr::iterator,bool>res = mymap.insert(mstr::value_type("STL教程",String()));
//将新键值对的值赋值为指定的值
res.first->second = "http://c.biancheng.net/java/";
可以看到,使用 operator[ ] 添加新键值对元素的流程是,先构造一个值的键值对,然后再为其 value 赋值。

那么,为什么不直接构造一个添加的键值对元素呢,比如:
mymap.insert(mstr::value_type("STL教程","http://c.biancheng.net/java/"));
此行代码和上面程序的执行效果完全相同,但它省略了创建临时 String 对象的过程以及析构该对象的过程,同时还省略了调用 String 类重载的赋值运算符。由于可见,同样是完成向 map 容器添加新键值对,insert() 方法比 operator[ ] 的执行效率更高。

更新map容器中的键值对,operator[]效率更高

仍以程序一中的代码为例,如下分别是 operator[ ] 和 insert() 实现更新 mymap 容器中指定键对应的值的代码
//operator[]
mymap["STL教程"] = "http://c.biancheng.net/stl/";
//insert()
std::pair<String,"http://c.biancheng.net/python/" };
mymap.insert(STL).first->second = "http://c.biancheng.net/java/";
仅仅从语法形式本身来虑,或许已经促使很多读者选择 operator[ ] 了。接下来,我们再从执行效率的角度对比以上 2 种实现方式。

从上面代码可以看到,insert() 方法在进行更新操作之前,需要有一个 pair 类型(也就是 map::value_type 类型)元素做参数。这意味着,该方法要多构造一个 pair 对象(附带要构造 2 个 String 对象),并且事后还要析构此 pair 对象(附带 2 个 String 对象的析构)。

而和 insert() 方法相比,operator[ ] 就不需要使用 pair 对象,自然不需要构造(并析构)任何 pair 对象或者 String 对象。因此,对于更新已经存储在 map 容器中键值对的值,应优先使用 operator[ ] 方法

大佬总结

以上是大佬教程为你收集整理的C++ map(STL map)operator[]和insert()效率对比(深度剖析)全部内容,希望文章能够帮你解决C++ map(STL map)operator[]和insert()效率对比(深度剖析)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: