博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Effective_STL 学习笔记(二十四) 当关乎效率时应该在 map::operator[] 和 map-insert 之间仔细选择...
阅读量:6275 次
发布时间:2019-06-22

本文共 1274 字,大约阅读时间需要 4 分钟。

 

假设有一个支持默认构造函数以及从一个 double 构造和赋值的 Widget 类:

1   class Widget2   {3   public:4     Widget();5     Widget( double weight );6     Widget & operator = ( double weight );7     . . .8   }

现在让我们假设我们想建立一个从 int 到 Widget 的 map,初始化有特定值的映射:

1   map
m;2   m[1] = 1.50;3   m[2] = 3.67;4   m[3] = 10.5;5   m[4] = 45.8;6   m[5] = 0.0003;

map::operator[] 被设计为简化 “添加或更新” 功能。即,给定

1   map
m;2   m[k] = v;

检查键 k 是否已经在 map 里,如果不,就添加上,以 v 作为它的对应的值,

如果 k 已经在 map 里,它的关联值被更新为 v

 

原理: operator[ ] 返回一个与 k 关联的对象的引用。然后 v 赋值给所引用的对象。当要更新一个已存在的键的关联值时很直接,因为已经有 operator[] 可以用来返回引用的值对象。如果 k 不在 map 里,operator[] 就没有可以引用的值对象。使用值类型的默认构造函数从头开始建立一个,然后 operator[] 返回这个新建立对象的引用。

1   m[1] = 1.50;

功能上等价于这个:

1   typedef map
IntWidgetMap;  // 方便的typedef2   pair
result = m.insert( IntWidgetMap::value_type( 1, Widget() ) );3                           // 用键1建立新的映射入口和一个默认构造的值对象4   result.first->second = 1.50;       // 赋值给新构造的值类型

而使用 insert:

1   m.insert( IntWidgetMap::value_type(1, 1.50) );

由此可见,insert 方法除了节省了三次函数调用:一个建立临时的默认构造函数Widget对象,一个销毁那个临时的对象和一个对Widget的赋值操作。

 

每个标准容器都提供了 value_type typedef,对于 map 和 multimap 很重要,容器元素类型总是某种 pair

 

如果你要更新已经存在的 map 元素,operator[] 更好,但如果你要增加一个新元素,insert 则有优势。

 

转载于:https://www.cnblogs.com/kidycharon/p/10032430.html

你可能感兴趣的文章
思维题 Gym 100553A Alter Board
查看>>
Abstract class与interface的区别
查看>>
Eclipse常用设置
查看>>
[原创] 扩展jquery-treegrid插件, 实现勾选功能和全删按钮.
查看>>
mysql面试
查看>>
统提示【此虚拟机似乎正在使用中】,虚拟机不能打开问题解决方案介绍
查看>>
MongoDB:mongodb的安装和增删改查入门
查看>>
v4l2框架
查看>>
索引器
查看>>
winform中 saveFileDialog 和openFileDialog 保存文件的用法
查看>>
记一次油猴脚本开发笔记
查看>>
网卡松的症状
查看>>
DeepLearning.ai-Week1-Convolution+model+-+Application
查看>>
搭建自己的git服务器
查看>>
MySQL 连接数据库
查看>>
小程序:web-view采坑指南
查看>>
mysql性能优化
查看>>
canvas与svg的区别
查看>>
href的那些事
查看>>
浏览器批量打印条码纸
查看>>