摘要:
条目二十五《熟悉非标准的散列容器》 STL标准不没有标准的散列容器,不过我们可以使用开源的,作为STL库中非标准存在的,即将加入标准库的hast_map,hash_set。 它们在不同的厂商有不同的实现,比较常用的版本有: 1.SGI 2.Dinkumware 二者都是基于开放式散列策略。 前者是一 阅读全文
摘要:
2019年的计划第一个暂未达成,其实Effective STL这本书18年12月开始看的了,只不过由于年末节日多,项目版本更新频繁,空闲时间少而一直缓慢的前进。 直至目标截止期的今天,也只不过是看完一遍,第二遍巩固并写博文到 条目二十四 ,距离目标还有26条。 但尽力了,有时是事不在人为的。不过为了 阅读全文
摘要:
条目二十四《当效率至关重要时,请在map::operator[]与map::insert之间谨慎做出选择》 当效率至关重要时,应该在 和`map::insert operator[] insert`。 下面来分析为什么是这样子的。 首先先说明,下面两个式子是等价的: map ss; ss[1]=2 阅读全文
摘要:
条目二十三《考虑用排序的vector替代关联容器》 在看到这个条目的标题的时候,说实话,我一下子是比较懵逼的。这个结论怎么和数据结构的时间复杂度不一致了? 一般来说,像map,set等关联容器的底层因为是红黑树结构,那么即使红黑树的时间复杂度并非是绝对的对数时间,但也是稳定的接近对数时间。 然而类似 阅读全文
摘要:
条目二十一《总是让比较函数在等值情况下返回false》 这条目对序列容器是不适合的,因为序列容器就是通过等值判断来比较的。 对于关联容器来说,比较是 等价比较 ,所以要注意等值的时候,比较子的返回值。 关联容器的find、insert等都是通过 等价 来判断元素是否已存在的。 注意关联容器的等价表达 阅读全文
摘要:
条目二十二《切勿修改set或multiset的键》 所有的标准关联容器一样,set和multiset按照一定的顺序来存放自己的元素,而这些容器的正确行为也是建立在其元素保持有序的基础之上的。如果你把关联容器中一个元素的值改变,那么元素在容器的位置就被破坏。 对于map和multimap来说,这应该是 阅读全文
摘要:
条目二十《为包含指针的关联容器指定比较类型》 stl中的关联容器是一种动态数据结构,其数据存储方式是以内存节点方式的数据结构,具体来说一般是一种平衡二叉树(红黑树),在向关联容器插入元素的时候,容器内部为了保持树的平衡性,会自动(插入函数有自我调整代码)的调整当前插入元素的存储位置,达到动态平衡的目 阅读全文
摘要:
《条目十八》避免使用vector 先说结论: 一是: 不是标准容器,因为标准容器的对于 必须是可编译的。 二是: 并不是以单个元素为 来存储的。 在底层实现中, 中为了节省空间, 并不真的是以单个字节来存储的,而是通过 来表示的,一个位代表一个 表示。 vector不满足STL容器的必要条件,你最好 阅读全文
摘要:
《条目十九》了解相等和等价的区别 在stl标准库中,find和insert两个操作都涉及到对数据的 比较 。但是他们是两种不同的比较,前者是基于 相等 (基于 ,表达式 ),后者是基于 等价 (基于`if(!x { bool operator()(const string& lhs,const st 阅读全文
摘要:
条目十七《使用“交换技巧”来修整过剩容量》 先说原理: 创建一个临时容器,把 容器 拷贝到 临时容器 ,借用拷贝构造函数只对原容器有效元素拷贝而忽略多余的空间,然后再把临时容器和原容器的内容 互相交换 ,就达到容量尽可能修剪的目的。 记住!!!是尽可能修剪。因为容器,比如vector在底层的实现可能 阅读全文
摘要:
《条目十六》如何将vector和string的数据传给遗留的API 优秀的代码是可以延续的,所以并非所有的代码都是重构的,而且有时候重构会对整个系统影响较大,投入巨大,得不偿失。然而,也不必为了系统的稳定而抛弃先进和方便的技术。 正如如果你想在遗留的 老代码 中想传 和`string`给形参是数组的 阅读全文