###《Effective STL》--Chapter3
点击查看Evernote原文。
#@author: gr
#@date: 2014-09-13
#@email: forgerui@gmail.com
Chapter3 关联容器
Topic 22: 切勿直接修改set
或multiset
中的键
修改元素的值可以通过下面五步操作,避免作类型转换。
struct IDNumberLess : public binary_function<Employee, Employee, bool> {bool operator() (const Employee& lhs, const Employee& rhs){return lhs.idNumber() < rhs.idNumber();}
}
/* 1. 查找要修改的元素 */
set<Employee, IDNumberLess> se;
//...
Employee selectedID;
iterator it = se.find(selectedID);
if (it != se.end()){/* 2. 拷贝元素 */Employee tmp(*it);/* 3. 修改元素值 */tmp.setTitle("hello");/* 4. 删除原来元素 */se.erase(it++);/* 5. 插入新元素 */se.insert(it, tmp);
}
Topic 23: 考虑用排序的vector
替代关联容器
Topic 24: 当效率至关重要时,请在map::operator[]
与map::insert
之间谨慎做出选择。
这一条款说起来很简单,就是使用map
时,如果是更新操作使用map::operator[]
;如果是插入新值时使用map::insert
。
map<int, Widget> m;
//更新操作,m中含有key为1,使用operator[]
m[1] = 1.5;
//插入操作,不含有key为2的项,不用operator[],使用insert
m.insert(map<int, Widget>::value_type(2, 1.50));
这个问题的起源在于map::operator[]
既可以更新旧值又可以插入新值,但使用map::operator[]
进行插入新值效率很低,他会先调用默认构造函数创建一个默认对象,返回引用,修改其值。
最后也可以自己实现一个函数判断是更新还是插入,分别调用map::operator[]
和map::insert
。
Topic 25: 熟悉非标准的散列容器
除了标准的STL容器,还可以使用其它渠道的容器,包括hash_set
,hash_multiset
,hash_map
,hash_multimap
。不同的提供方实现的形式也各自不同。
SGI
的实现把元素放在一个单向的链表中,Dinkumware
的实现则使用了双向链表,但内存消耗更大。根据自己的实际情况选择。
转载于:https://www.cnblogs.com/gr-nick/p/3996107.html
###《Effective STL》--Chapter3相关推荐
- 《Effective STL》学习笔记(第一部分)
本书从STL应用出发,介绍了在项目中应该怎样正确高效的使用STL.本书共有7个小节50个条款,分别为 (1) 容器:占12个条款,主要介绍了所有容器的共同指导法则 (2) vector和string: ...
- 两本小书的命运 --- 记《Effective STL》和《The Art Of Deception》两本书的出版翻译过程
这两年来,时常听到读者或者朋友们问我"最近还有新书要出版吗",我的回答是,有两本拖了很久的书快要出版了.我乐观地估计,这两本书在2005年都能出版,然而,不幸的是,这两本书都未能如 ...
- 《Effective STL》重读笔记整理
最近有闲,在工作之余重读了<effective STL>一书,并通过 twitter 记了一下笔记,今天整理收集到这里. twitter 真的非常适合记读书笔记,哈哈,以后要好好地发扬.另 ...
- 【绝版C++书籍】《Effective STL》读书笔记
<Effective STL>读书笔记 写在前面 0<Effective STL>中可能过时的内容 1 容器 第1条:慎重选择容器类型. 第2条:不要试图编写独立于容器类型的代 ...
- 《Effective STL》 读书笔记
Effective STL 剥离 向基类对象的容器中插入派生类对象,派生类对象独有的特性会丢失 empty 检查容器是否为空用empty而不是size 善于使用区间成员函数(assign,etc) v ...
- 《Effective STL》中文版 读书笔记
50条有效使用STL的经验 第一条 慎重选择容器类型(20190713) 第二条 不要试图编写独立于容器类型的代码(20190713) 第三条 确保容器中的对象副本正确而高效(20190713) 第四 ...
- 《Effective STL》条款解读
条款01:慎重选择容器类型 vector.list和deque有着不同的复杂度,vector是默认使用的序列类型.当需要频繁在序列中间做插入和删除操作时,应使用list.当大多数插入和删除操作发生在序 ...
- 《Effective STL》学习笔记(第四部分)
6.仿函数.仿函数类.函数等 函数和类似函数的对象--仿函数--遍布STL.关联容器使用它们来使元素保持有 序:find_if使用它们来控制它们的行为:如果缺少它们,那么比如for_each和tran ...
- 《Effective STL》学习笔记(第三部分)
4. 迭代器 标准STL容器提供了四种不同的迭代器:iterator.const_iterator.reverse_iterator和const_reverse_iterator 为什么有四种迭代器? ...
最新文章
- Nature子刊:用16S及18S rRNA全长进行微生物多样性研究
- 第八节 字符串的插入
- Linux mail 命令参数
- VS2017-MFC-生成二维码测试小程序
- 阿里云服务网格 ASM 发布新功能:提供更精细化的服务治理能力
- TEG Cheers | 腾讯技术工程运维技术沙龙精彩回顾(内置现场视频)
- mysql优化器分析器_MySQL查询优化器的概念和原理整个执行过程
- 系统测试集成测试单元测试_等待正确的时刻–集成测试
- 基于SpringBoot的CodeGenerator
- java和mysql之间的时间日期类型传递
- Linux最大能创建多少用户,如何在Linux中创建多个用户帐户?
- c++ 关于指针以及(amp;)使用的一些小问题
- 数组的常用算法(1)--由“为了集齐108将买多少袋干脆面”展开去
- 宝宝性别测试软件,胎儿性别测试方法
- 微信动态表情保存到手机相册
- 《机器学习的数学》出版了,彻底解决程序员学机器学习的数学问题
- 快速神经网络的训练算法LARS/LAMB工作原理 --UC Berkeley在读博士生尤洋
- 仿射密码加密解密代码(java)
- TeXstudio:LaTeX模板使用
- 【06】【Tomcat】