###《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 ...
随机推荐
- hdu 1595 find the longest of the shortest【最短路枚举删边求删除每条边后的最短路,并从这些最短路中找出最长的那条】
find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others) Memory Limit: 32768/32768 ...
- light oj 1138 - Trailing Zeroes (III)【规律&&二分】
1138 - Trailing Zeroes (III) PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: ...
- oracle的commit
oracle的commit就是提交数据(释放锁),在未提交前你前面的操作更新的都是内存,没有更新到物理文件中.执行commit从用户角度讲就是更新到物理文件了,事实上commit时还没有写date f ...
- Redis实战
大约一年多前,公司同事开始使用Redis,不清楚是配置,还是版本的问题,当时的Redis经常在使用一段时间后,连接爆满且不释放.印象中,Redis 2.4.8以下的版本由于设计上的主从库同步问题,就会 ...
- iOS stretchableImageWithLeftCapWidth 图片放大不变形
转载自:http://www.cnblogs.com/bandy/archive/2012/04/25/2469369.html - (UIImage *)stretchableImageWithLe ...
- js replace如何实现全部替换
js中replace默认只替换第一个相关字符,要想实现替换全部相关字符.如下: replace(/*/g, ','); 例如,替换字符串中的\n str.replace(/\n/g, ',');
- hdu 5497 Inversion 树状数组 逆序对,单点修改
Inversion Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5497 ...
- Web版RSS阅读器(三)——解析在线Rss订阅
上篇博客<Web版RSS阅读器(二)——使用dTree树形加载rss订阅分组列表>已经写到读取rss订阅列表了,今天就说一下,当获取一条在线rss订阅的信息,怎么去解析它,从而获取文章或资 ...
- 跟Android初学者分享几点经验
刚学Android开发的人肯定想知道过来人是怎样入门的,有哪些经验,怎样能少走弯路.本文就跟大家分享一位Android开发者的入门经验,写的条理很清晰,真正讲出了自己的学习过程,尽管每个人的学习方法和 ...
- G711
G.711就是语音模拟信号的一种非线性量化.细分有二种:G.711 a-lawand G.711 u-law.不同的国家和地方都会选取一种作为自己的标准. G.711a/u bitrate 是64kb ...