STL学习笔记(三) 关联容器
条款19:理解相等(equality)和等价(equivalence)的区别
相等的概念是基于 operator== 的,如果 operator== 的实现不正确,会导致并不实际相等
等价关系是以"在已排好序的区间中对象值的相对顺序"为基础的,关联容器默认是以 operator< 为基础
此时 w1 和 w2 若相等,则有 !(w1 < w2) && !(w2 < w1),或者使用函数对象 !container.comp(x, y) && !container.comp(y, x);
条款20:为包含指针的关联容器指定比较类型
关联容器包含指针时 基于比较的对象是指针(即地址值)而不是所指元素值
set<string*> ssp;
其实是:
set<string*, less<string*> > ssp; //默认采用 less 函数对象进行比较
我们需要按照 string值 进行排序,而不是对string*指针地址值进行排序,所以自定义比较类型的函数对象
class DereferenceLess {
public:
template<typename ptrType>
bool operator() {ptrType pT1, ptrType pT2} {
return *pT1 < *pT2;
}
};
然后在如下声明:
set<string*, DereferenceLess> ssp;
条款21:总是让关联容器比较函数在等值情况下返回 false
条款22:切勿直接修改 set 容器中的键
直接修改map容器的键值编译不通过,如 m.begin()->first = 10; //编译错误
因为map容器的元素类型是 pair<const K, V>
set容器中元素类型是 T,而不是 const T
如果改变了 set 容器中的元素,注意一定不能改变键值部分,元素的键值信息会影响容器的排序性,改变了这部分可能会破坏容器
如果直接对set容器元素进行了修改,一定得保证修改后容器仍然是排好序的
如果要防止被修改,可以使用 const_iterator 迭代器
条款23:考虑使用排序的vector替代关联容器
排好序的vector使用 binary_search 比通过map容器执行二分搜索具有更好的性能
当存在大量元素时,采用map容器因为二叉平衡树中每个元素都要多存储两个指针,导致关联容器会比vector占用更多的内存,可能会导致虚拟内存中更多的页面不命中
如果你想使用排序vector替换map时,必须自定义一个 pair比较函数,而且是 pair<K,T> 不是 pair<cont K,V>,因为排序过程中涉及到赋值操作
条款24:当效率至关重要时,请在map::operator[] 和 map::insert 之间谨慎选择
map::operator[] 的设计是为了提供"添加和更新"的功能
对于 map<K, V> m;
m[K] = V; //检查键值K值是否已经在map中,如果已存在,就将键值K对应的value更新为V;如果没有,它就被添加到map中
当向map中添加元素时,要优先使用insert,而不是 operator[]
当更新已经存在map中的元素时,要优先选择 operator[]
条款25:熟悉非标准的哈希容器 // c++11已经有标准hash容器了 std::unordered_set std::unordered_map
STL学习笔记(三) 关联容器的更多相关文章
- 高放的c++学习笔记之关联容器
标准库提供8个关联容器 按关键字有序保存有(红黑树实现) set map multset 关键字可重复出现的set multimap 关键字可重复出现的map 无序保存 哈希实现 unorderre ...
- STL学习笔记(关联式容器)
Set和Multisets set和multiset会根据特定的排序准则,自动将元素排序.两者不同在于multisets允许元素重复而set不允许. 1.set和multiset的操作函数 生成.复制 ...
- STL学习笔记--序列式容器
1.vector vector是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩展.故可以将vector看作动态数组. 在创建一个vector后,它会自动在内存中分配一块连续的内存空间 ...
- muduo网络库学习笔记(三)TimerQueue定时器队列
目录 muduo网络库学习笔记(三)TimerQueue定时器队列 Linux中的时间函数 timerfd简单使用介绍 timerfd示例 muduo中对timerfd的封装 TimerQueue的结 ...
- Effective STL 学习笔记: Item 22 ~ 24
Effective STL 学习笔记: Item 22 ~ 24 */--> div.org-src-container { font-size: 85%; font-family: monos ...
- Effective STL 学习笔记 Item 21:Comparison Function 相关
Effective STL 学习笔记 Item 21:Comparison Function 相关 */--> div.org-src-container { font-size: 85%; f ...
- 标准模板库(STL)学习探究之vector容器
标准模板库(STL)学习探究之vector容器 C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...
- VSTO学习笔记(三) 开发Office 2010 64位COM加载项
原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...
- 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记
回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...
随机推荐
- 签名ipa,让其它手机也安装
开发的时候,需要将app让其它人装上测试,虽然通过xcode可以使用编译进去,但是仍显不方便. 网上有个工具, http://code.google.com/p/iresign/ 通过这个工具,使用自 ...
- 广播接收者 BroadcastReceiver
1. 分为动态注册和静态注册, 静态注册在清单文件里配置即可.动态创建为代码手动添加. 在锁屏广播中, 使用静态创建消息接受不成功, 原因未知. 动态即可. 代码如下: 2. 创建类, 继承与Broa ...
- JS常用操作节点的方法
js常见的创建dom节点的方法有 createElement() 创建一个元素节点 => 接收参数为string类型的nodename createTextNode() 创建一个文本节点 =&g ...
- ZOJ-1360 || POJ-1328——Radar Installation
ZOJ地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=360 POJ地址:http://poj.org/problem?id ...
- shelll脚本,常见的脚本题目。
[root@localhost wyb]# cat 2quan.sh #!/bin/bash #写一个脚本,先要求输入用户名,然后让他输入一个数字,输的如果是数字给输出yes,不是数字,输出no #然 ...
- shell脚本,检查给出的字符串是否为回文
[root@localhost wyb]# .sh #!/bin/bash #检查给出的字符串是否为回文 read -p "Please input a String:" numb ...
- java在线聊天项目 实现基本聊天功能后补充的其他功能详细需求分析 及所需要掌握的Java知识基础 SWT的激活方法,swt开发包下载,及破解激活码
补充聊天项目功能,做如下需求分析: 梳理项目开发所需的必要Java知识基础 GUI将使用更快速的swt实现 SWT(Standard Widget Toolkit) Standard Widget T ...
- 使用custom elements和Shadow DOM自定义标签
具体的api我就不写 官网上面多 如果不知道这个的话也可以搜索一下 目前感觉这个还是相当好用的直接上码. <!DOCTYPE html> <html lang="en&q ...
- 【树形背包】bzoj4033: [HAOI2015]树上染色
仔细思考后会发现和51nod1677 treecnt有异曲同工之妙 Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 ...
- MySQL丨01丨数据库基本概念
以前记录数据可能很少也很简单,比如说老王借了老李半斤肉,这样的数据老李直接就写到墙上就行了. 后来数据多了人们就以表格的方式开始记录,写到一张A4纸上,比如学生的档案,有表头和序号等. 表头里有姓名. ...