学习笔记-Effective STL-关联容器

本文探讨了C++ STL关联容器的高效使用方法,包括理解相等与等价的区别、为指针关联容器指定比较类型、确保比较函数对等值返回false等关键实践。此外还讨论了替代方案如有序vector的应用场景及map操作符与插入方法的选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
条款19:了解相等和等价的区别
       操作上来说,相等的概念是基于operator==的。如果表达式“x == y”返回true,x和y有相等的值,否则它们没有。等价是基于在一个有序区间中对象值的相对位置。两个对象x和y如果在关联容器c的排序顺序中没有哪个排在另一个之前,那么它们关于c使用的排序顺序有等价的值。!(w1 < w2) && !(w2<w1)      要完全领会相等和等价的含义,考虑一个忽略大小写的set<string>,也就是set的比较函数忽略字符串中字符大小写的set<string>。这样的比较函数会认为“STL”和“stL”是等价的。
条款20:为指针的关联容器指定比较类型
struct DereferenceLess {
template <typename PtrType>
bool operator()(PtrType pT1, PtrType pT2) const                                           {return *pT1 < *pT2; }
};
typedef set<string*, DereferenceLess > StringPtrSet;
StringPtrSet ssp;
set不要一个函数,它要的是能在内部用实例化建立函数的一种类型(仿函数模板)。
条款21: 永远让比较函数对相等的值返回false
       除非你的比较函数总是为相等的值返回false,你将会打破所有的标准关联型容器,不管它们是否允许存储复本。从技术上说,用于排序关联容器的比较函数必须在它们所比较的对象上定义一个“严格的弱序化(strict weak ordering)”。任何一个定义了严格的弱序化的函数都必须在传入相同的值的两个拷贝时返回false。
条款22:避免原地修改set和multiset的键
       对于set和multiset,如果你进行任何容器元素的原地修改,你有责任确保容器保持有序。
条款23:考虑用有序vector代替关联容器
       在有序vector中存储数据很有可能比在标准关联容器中保存相同的数据消耗更少的内存;当页面错误值得重视的时候,在有序vector中通过二分法查找可能比在一个标准关联容器中查找更快。当然,有序vector的大缺点是它必须保持有序!当一个新元素插入时,大于这个新元素的所有东西都必须向上移一位。
条款24:当关乎效率时应该在map::operator[]和map-insert之间仔细选择
       m[k] = v; 检查键k是否已经在map里。如果不,就添加上,以v作为它的对应值。如果k已经在map里,它的关联值被更新成v。通过使用map-insert代替map::operator[]就能节省一些。
条款25:熟悉非标准散列容器
       hash_set、hash_multiset、hash_map和hash_multimap
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值