###《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 ...
随机推荐
- python 访问限制
在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑. 但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的na ...
- 1N系列稳压二极管参数
1N系列稳压二极管参数 型号 稳定电压 型号 稳定电压 型号 稳定电压 1N5236 7.5 1N5738 12 1N6002 12 1N5237 8.2 1N5739 13 1N6003 13 1N ...
- (step 4.3.5)hdu 1035(Robot Motion——DFS)
题目大意:输入三个整数n,m,k,分别表示在接下来有一个n行m列的地图.一个机器人从第一行的第k列进入.问机器人经过多少步才能出来.如果出现了循环 则输出循环的步数 解题思路:DFS 代码如下(有详细 ...
- CodeIgniter网站静态化管理系统
CodeIgniter本身带了一套静态化系统 使用方法如下: $this->output->cache( 3 );//每三分钟重新生成一次静态页面 不过这个在系统化的编辑中不方便管理 由此 ...
- cocos2d-x UserDefault
转自:http://blog.csdn.net/yanghuiliu/article/details/6912612 正在做项目中有很多游戏数据要保存,常见的玩家数据这些比较简单的可以用CCUserD ...
- MSSQL 如何实现 MySQL 的 limit 查询方式 (转)
不知为何,MSSQL 中没有 limit 这个极为重要的查询方式,熟悉 MySQL 的朋友都知道,MySQL 的 limit 对于实现分页和一些限制结果集的应用中非常方便.没有不要紧,我们可以用其他方 ...
- 使用ttXactAdmin、ttSQLCmdCacheInfo、ttSQLCmdQueryPlan获取SQL相关具体信息[TimesTen运维]
使用ttXactAdmin.ttSQLCmdCacheInfo.ttSQLCmdQueryPlan获取SQL相关具体信息,适合于tt11以上版本号. $ ttversion TimesTen Rele ...
- 关于expanded一级二级菜单数据的分组排序
最新再弄关于expandedlistview相关的东西,所以需求是需要对一级菜单根据时间排序,同时二级菜单也需要根据时间排序,距离现在最近的时间显示在最前面. 效果就是如下: --group2 -- ...
- js原生瀑布流
背景: 1.在移动端开发,jq文件是显得非常庞大的,所以所有效果尽量用HTML5和原生js实现. 2.本次瀑布流是固定列数,采用非浮动的另外一种瀑布流思想实现的. 3.本次数据来源是json接口 4. ...
- JQuery Mobile navbar动态刷新创建
今天突然用到须要动态改变tab页, 布局代码例如以下: <div data-role="navbar" id='divtab'> <ul id='divtabul ...