博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STL学习笔记(三) 关联容器
阅读量:5113 次
发布时间:2019-06-13

本文共 1514 字,大约阅读时间需要 5 分钟。

条款19:理解相等(equality)和等价(equivalence)的区别

相等的概念是基于 operator== 的,如果 operator== 的实现不正确,会导致并不实际相等

等价关系是以"在已排好序的区间中对象值的相对顺序"为基础的,关联容器默认是以 operator< 为基础
此时 w1 和 w2 若相等,则有 !(w1 < w2) && !(w2 < w1),或者使用函数对象 !container.comp(x, y) && !container.comp(y, x);

 

条款20:为包含指针的关联容器指定比较类型

关联容器包含指针时 基于比较的对象是指针(即地址值)而不是所指元素值

set
ssp;

 

其实是:

set
> ssp; //默认采用 less 函数对象进行比较

 

我们需要按照 string值 进行排序,而不是对string*指针地址值进行排序,所以自定义比较类型的函数对象

class DereferenceLess {public:    template
bool operator() {ptrType pT1, ptrType pT2} { return *pT1 < *pT2; }};

然后在如下声明:

set
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

 

转载于:https://www.cnblogs.com/wwwjieo0/p/3444004.html

你可能感兴趣的文章
Nginx配置详解
查看>>
向学,相遇。
查看>>
oracle常用函数
查看>>
显示器变蓝色和图像偏移的解决办法
查看>>
mysql应用实例
查看>>
docker从容器里面拷文件到宿主机或从宿主机拷文件到docker容器里面
查看>>
wineqq中接收文件的查看与移动
查看>>
(12)javascript 面向对象 理解对象
查看>>
个人作业
查看>>
redis的安装
查看>>
MySQ binlog三种模式及设置方法
查看>>
python基础学习-6(正则)
查看>>
【博弈】海盗分赃
查看>>
JAVA中构造函数的参数传递给类中的实例变量
查看>>
已知三角形三个顶点求三角形内心
查看>>
poj 1274 (二分匹配)
查看>>
程序员的自我救赎(前言)
查看>>
Debian Linux 下安装pip3
查看>>
设计模式学习笔记-原型模式
查看>>
[Leetcode]寻找峰值
查看>>