Effective STL 学习笔记: Item 22 ~ 24

*/-->

div.org-src-container {
font-size: 85%;
font-family: monospace;
}

1 避免 \(set \& multiset\) 在原位改变 Key

set, multiset, map, multimap 都是有序的容器,如果直接在原位改变 key 的值,则很有可能容器不有序,后续对该容器的算法会失效。

2 Consider replacing associative containers with sorted vectors

Associative Container 中的每个 Node 除了保存真正对象外,还需要维护指向 Parent, Previous,
Next
的三个指针,相比 vector 来说,更占用内存,范文时间为 O(logn)。 而 vectors,如果配合合适的 Hash Function ,则既省时间又省空间,但不足之处是需要自己始终维持 vector 在有序的状态。

3 Choose carefully between map::operator[] and map-insert

map::operator[] 会返回 Value 的一个引用,而如果对应的 Key 在 Map 中没有 Value, map 会调用
Default Constructor 来创建一个新的,加到 Map 中,然后再将新的 Value 返回出来,例如,下面的代码中:

 1: class Widget
2: {
3: public:
4: Widget(){}
5: Widget(double d):m_value(d){}
6: virtual ~Widget(){}
7: private:
8: double m_value;
9: };
10:
11: map<int, Widget> m;
12: m[1] = 1.50;

第 12 行一行代码实际上和下面的代码是等效的:

13: pair<map<int, Widget>::iterator, bool> result =
14: m.insert(map<int, Widget>::value_type(1, Widget()));
15: result.first->second = 1.50;

实际上,我们可以用下面的一行代码来完成所需操作,避免无谓的默认构造:

m.insert(map<int, Widget>::value_type(1, 1.50));

但如果我们想更新已有的 Key, 则 [ ] 更简单一些。

书中最后给出了一个例子,用于高效的添加或者更新 map:

 1: template <typename MapType,
2: typename KeyType,
3: typename ValueType>
4: typename MapType::iterator
5: efficientAddOrUpdate(MapType& map,
6: cons KeyType& k,
7: const ValueType& v)
8: {
9: typename MapType::iterator lb = m.lower_bound(k);
10: if (lb != m.end() && !(m.key_comp()(k, lb->first)))
11: {
12: lb->second = v;
13: return lb;
14: }
15: else
16: {
17: typedef typename MapType::value_type MVT;
18: return m.insert(lb, MVT(k,v));
19: }
20: }

Effective STL 学习笔记: Item 22 ~ 24的更多相关文章

  1. Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value

    Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value */--> div.org-src-container ...

  2. Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据

    Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据 */--> div.org-src-container { font-size: 85%; font-fam ...

  3. Effective STL 学习笔记 Item 30: 保证目标区间足够大

    Effective STL 学习笔记 Item 30: 保证目标区间足够大 */--> div.org-src-container { font-size: 85%; font-family: ...

  4. Effective STL 学习笔记 Item 26: Prefer Iterator to reverse_iterator and const_rever_itertor

    Effective STL 学习笔记 Item 26: Prefer Iterator to reverse_iterator and const_rever_itertor */--> div ...

  5. Effective STL 学习笔记 Item 21:Comparison Function 相关

    Effective STL 学习笔记 Item 21:Comparison Function 相关 */--> div.org-src-container { font-size: 85%; f ...

  6. Effective STL 学习笔记 Item 17: Swap Trick

    假设有若干对象存于一个 vector 中: class Widget; vector<Widget> vw; 后来由于某些原因,从该容器中删除了若干对象(参考erase-remove id ...

  7. Effective STL 学习笔记 Item 16:vector, string & C API

    有时需要支持 C 的接口,但这并不复杂. 对于 vector 来讲, \(v[0]\) 的地址 \(\&v[0]\) 即可作为数组指针传递给 C API: 1: // Legacy C API ...

  8. Effective STL 学习笔记 Item 18: 慎用 vector<bool>

    vector<bool> 看起来像是一个存放布尔变量的容器,但是其实本身其实并不是一个容器,它里面存放的对象也不是布尔变量,这一点在 GCC 源码中 vector<bool> ...

  9. Effective STL 学习笔记 32 ~ 33

    Effective STL 学习笔记 32 ~ 33 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

随机推荐

  1. Tensorflow Object_Detection 目标检测 笔记

    Tensorflow models Code:https://github.com/tensorflow/models 编写时间:2017.7 记录在使用Object_Detection 中遇到的问题 ...

  2. 【Asp.net入门5-01】SportsStore:一个真实的应用程序

  3. Ansible6:Playbook简单使用

    目录 一个简单的示例 通过Playbook安装apache示例 playbook的构成 Hosts和Users 任务列表和action handlers tags 示例 ansbile-playboo ...

  4. Rigidbody和Collider

    Rigidbody: 常用属性: Mass:默认为1,单位并不是g或kg,而是相对的质量计量单位,只决定物体的惯性: Drag:空气阻力: Angular Drag:角阻力,旋转时受的阻力: Use ...

  5. Oracle 中常用数据字典大总结

    原文出处:小宝马的爸爸 - 梦想的家园 前面呢,也断断续续的介绍了一些诸如 Sql*Plus 等等关于 Oracle 的基本的内容, 对于 Oracle 这样的大型数据库呢,自身的运行和维护也是个不得 ...

  6. python---基础知识回顾(十一)图像处理模块PIL

    前戏: 虽然PIL没有入OpenCV那样强大的功能,但是所提供的功能,在一般的图像处理中足够使用. 图像类别: 计算机绘图中有两类图像:一类是矢量图,另一类是点阵图(位图) 矢量图:基于计算机数字对象 ...

  7. vue短信验证性能优化写入localstorage中

    平时我们在项目中进行注册等的时候,会经常用到短信验证的功能,但是现在现在很多短信验证都是存在下面几个问题,例如短信验证时间为60s的时候, 1. 当点击完按钮时,倒计时还没到60s过完时,刷新浏览器, ...

  8. java项目中Excel文件预览

    package com.linkonworks.df.busi.utils; import java.io.File; import java.io.FileInputStream; import j ...

  9. centos7 源码构建、安装dubbo-monitor

    按照官方文档 ,发现dubbo-monitor-simple-x.x.x-assembly.tar.gz  下载不下来(地址访问不了),那么就自己下载源码构建吧. 我的zookeeper,hadoop ...

  10. pta 一

    7-1 打印沙漏 (20 分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数 ...