点击查看Evernote原文。

#@author:       gr
#@date:         2014-09-13
#@email:        forgerui@gmail.com

Chapter3 关联容器

Topic 22: 切勿直接修改setmultiset中的键

修改元素的值可以通过下面五步操作,避免作类型转换。

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_sethash_multisethash_maphash_multimap。不同的提供方实现的形式也各自不同。
  
  SGI的实现把元素放在一个单向的链表中,Dinkumware的实现则使用了双向链表,但内存消耗更大。根据自己的实际情况选择。

转载于:https://www.cnblogs.com/gr-nick/p/3996107.html

###《Effective STL》--Chapter3相关推荐

  1. 《Effective STL》学习笔记(第一部分)

    本书从STL应用出发,介绍了在项目中应该怎样正确高效的使用STL.本书共有7个小节50个条款,分别为 (1) 容器:占12个条款,主要介绍了所有容器的共同指导法则 (2) vector和string: ...

  2. 两本小书的命运 --- 记《Effective STL》和《The Art Of Deception》两本书的出版翻译过程

    这两年来,时常听到读者或者朋友们问我"最近还有新书要出版吗",我的回答是,有两本拖了很久的书快要出版了.我乐观地估计,这两本书在2005年都能出版,然而,不幸的是,这两本书都未能如 ...

  3. 《Effective STL》重读笔记整理

    最近有闲,在工作之余重读了<effective STL>一书,并通过 twitter 记了一下笔记,今天整理收集到这里. twitter 真的非常适合记读书笔记,哈哈,以后要好好地发扬.另 ...

  4. 【绝版C++书籍】《Effective STL》读书笔记

    <Effective STL>读书笔记 写在前面 0<Effective STL>中可能过时的内容 1 容器 第1条:慎重选择容器类型. 第2条:不要试图编写独立于容器类型的代 ...

  5. 《Effective STL》 读书笔记

    Effective STL 剥离 向基类对象的容器中插入派生类对象,派生类对象独有的特性会丢失 empty 检查容器是否为空用empty而不是size 善于使用区间成员函数(assign,etc) v ...

  6. 《Effective STL》中文版 读书笔记

    50条有效使用STL的经验 第一条 慎重选择容器类型(20190713) 第二条 不要试图编写独立于容器类型的代码(20190713) 第三条 确保容器中的对象副本正确而高效(20190713) 第四 ...

  7. 《Effective STL》条款解读

    条款01:慎重选择容器类型 vector.list和deque有着不同的复杂度,vector是默认使用的序列类型.当需要频繁在序列中间做插入和删除操作时,应使用list.当大多数插入和删除操作发生在序 ...

  8. 《Effective STL》学习笔记(第四部分)

    6.仿函数.仿函数类.函数等 函数和类似函数的对象--仿函数--遍布STL.关联容器使用它们来使元素保持有 序:find_if使用它们来控制它们的行为:如果缺少它们,那么比如for_each和tran ...

  9. 《Effective STL》学习笔记(第三部分)

    4. 迭代器 标准STL容器提供了四种不同的迭代器:iterator.const_iterator.reverse_iterator和const_reverse_iterator 为什么有四种迭代器? ...

最新文章

  1. Nature子刊:用16S及18S rRNA全长进行微生物多样性研究
  2. 第八节 字符串的插入
  3. Linux mail 命令参数
  4. VS2017-MFC-生成二维码测试小程序
  5. 阿里云服务网格 ASM 发布新功能:提供更精细化的服务治理能力
  6. TEG Cheers | 腾讯技术工程运维技术沙龙精彩回顾(内置现场视频)
  7. mysql优化器分析器_MySQL查询优化器的概念和原理整个执行过程
  8. 系统测试集成测试单元测试_等待正确的时刻–集成测试
  9. 基于SpringBoot的CodeGenerator
  10. java和mysql之间的时间日期类型传递
  11. Linux最大能创建多少用户,如何在Linux中创建多个用户帐户?
  12. c++ 关于指针以及(amp;)使用的一些小问题
  13. 数组的常用算法(1)--由“为了集齐108将买多少袋干脆面”展开去
  14. 宝宝性别测试软件,胎儿性别测试方法
  15. 微信动态表情保存到手机相册
  16. 《机器学习的数学》出版了,彻底解决程序员学机器学习的数学问题
  17. 快速神经网络的训练算法LARS/LAMB工作原理 --UC Berkeley在读博士生尤洋
  18. 仿射密码加密解密代码(java)
  19. TeXstudio:LaTeX模板使用
  20. 【06】【Tomcat】

热门文章

  1. 【算法竞赛学习】二手车交易价格预测-Task3特征工程
  2. oracle sequrnce_Oracle Sqlldr简单用法
  3. ucos-ii在ARM7上移植
  4. FPGA 资料搜集记录
  5. 在mac中使用git-flow
  6. PyCaret 2.0在这里-新增功能?
  7. Ubuntu开启telnet服务
  8. 魏桥集团创始人张士平去世,他是如何成为山东首富的?
  9. 拉5000万存款,银行客户经理能拿40万奖金?
  10. 支付宝2017年个人账单明天发布,你小心脏准备好了吗?