###《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
的实现则使用了双向链表,但内存消耗更大。根据自己的实际情况选择。
###《Effective STL》--Chapter3的更多相关文章
- 《Effective STL》学习笔记
http://www.cnblogs.com/arthurliu/archive/2011/08/07/2108386.html 作者:咆哮的马甲 出处:http://www.cnblogs.com/ ...
- ###《Effective STL》--Chapter5
点击查看Evernote原文. #@author: gr #@date: 2014-09-17 #@email: forgerui@gmail.com Chapter5 算法 Topic 30: 确保 ...
- ###《Effective STL》--Chapter6
点击查看Evernote原文. #@author: gr #@date: 2014-09-27 #@email: forgerui@gmail.com Chapter6 函数子.函数子类.函数及其他 ...
- ###《Effective STL》--Chapter7
点击查看Evernote原文. #@author: gr #@date: 2014-08-31 #@email: forgerui@gmail.com Chapter7 在程序中使用STL Topic ...
- ###《Effective STL》--Chapter1
点击查看Evernote原文. #@author: gr #@date: 2014-09-12 #@email: forgerui@gmail.com Chapter1 容器 Topic 4: 调用e ...
- ###《Effective STL》--Chapter2
点击查看Evernote原文. #@author: gr #@date: 2014-09-15 #@email: forgerui@gmail.com Chapter2 vector和string T ...
- ###《Effective STL》--Chapter4
点击查看Evernote原文. #@author: gr #@date: 2014-09-14 #@email: forgerui@gmail.com Chapter4 迭代器 Topic 26: i ...
- 容器使用的12条军规——《Effective+STL中文版》试读
容器使用的12条军规——<Effective+STL中文版>试读 还 记的自己早年在学校学习c++的时候,老师根本就没有讲STL,导致了自己后来跟人说 起会C++的时候总是被鄙视, ...
- 《Effective STL中文版》前言
<Effective STL中文版>前言 我第一次写关于STL(Standard Template Library,标准模板库)的介绍是在1995 年,当时我在More Effec ...
随机推荐
- 笔记-iOS 视图控制器转场详解(上)
这是一篇长文,详细讲解了视图控制器转场的方方面面,配有详细的示意图和代码,为了使得文章在微信公众号中易于阅读,seedante 辛苦将大量长篇代码用截图的方式呈现,另外作者也在 Github 上附上了 ...
- Struts2 + Spring + Hibernate 通用 Service 和 DAO
我在 Struts2 + Spring + Hibernate 项目开发中总结出了一个Service 和 DAO ,可以用于处理任何的pojo(bean).使用这两个Service 和 DAO 可以 ...
- 【Stage3D学习笔记续】山寨Starling(七):一般优化方法简介及混合模式
关于事件的优化: 遍历注册的事件由foreach改变为fori,在大量数据遍历时会有提升: 事件池优化: 所有的事件都使用一个对象池进行保存,而不是使用到时进行创建,使用EventDispatcher ...
- 10个Visual Studio原生开发调试技巧
10个Visual Studio原生开发调试技巧(1) 2013-05-29 13:30 佚名 开源中国 我要评论(1) 字号:T | T 以下的列表中你可以看到写原生开发的调试技巧(接着以前的文章来 ...
- SQL Server笔记
SQL Server所能读取的最小单位是页,每个页8KB,8个物理上连续的页就是一个区,这样数据库中每MB就包含有16个区 堆是没有聚集索引的表.如果表格上没有聚集索引,数据行将不按任何特殊顺序存储, ...
- AIR 移动设备上的存储控制
File.documentsDirectory, File.userDirectory, File.desktopDirectory 等.可以保存大的数据,如图片,视屏,和临时文件.访问这些文件的全选 ...
- 解决content is not allowed in prolog问题
将xml文档用notepad++以UTF-8无BOM格式编码保存便可以了
- Linux服务器的常用备份方法
系统备份是系统管理工作中十分重要的一个环切,本文详细介绍了各种Linux系统的备份方法,相信对大家的日常管理工作有所帮助. 备份是一项重要的工作,但是很多人没有去做.一旦由于使用不当造成数据丢失,备份 ...
- tar备份系统
一.概述 前几天我通过SSH正在调戏汤姆猫(tomcat)的时候,服务器上CentOS突然挂了.开机grub,使用光盘linux rescue修复提示找不到linux分区,然后想mount硬盘备份系统 ...
- Memcached source code analysis -- Analysis of change of state--reference
This article mainly introduces the process of Memcached, libevent structure of the main thread and w ...