随笔分类 -  Effective STL

摘要:《条目四十:若一个类是函数子,使它可适配》 在stl中,下面的函数适配器可以使函数指针转换为特定的类型,供下面的使用。 4个标准的函数配接器(not1、not2、bind1st和bind2nd)都要求一些特殊的类型定义,那些非标准的、与STL兼容的配接器通常也是如此。 但是如果是函数对象,那么需要继 阅读全文
posted @ 2019-03-31 23:53 那一抹风 阅读(231) 评论(0) 推荐(0)
摘要:《条目三十九 确保判别式是“纯函数”》 一个判别式(predicate)是一个返回值为bool类型(或者可以隐式地转换为bool类型)的函数。 一个纯函数(pure function)是指返回值仅仅依赖于其参数的函数。纯函数所能访问的数据应该仅局限于参数以及常量(在函数生命期内不会被改变 判别式类( 阅读全文
posted @ 2019-03-31 23:52 那一抹风 阅读(276) 评论(0) 推荐(0)
摘要:《条目二十九:对于逐个字符的输入请考虑istreambuf_iterator》 1.使用: ifstream inputfile("xxxx"); string fileDate((istream_iterator(inputfile)), istream_iterator()); 在流输入的时候遇 阅读全文
posted @ 2019-03-31 23:48 那一抹风 阅读(690) 评论(0) 推荐(0)
摘要:《条目三十:确保目标区间足够大》 在使用STL中的算法时,确保目标区间足够 大 ,这个 大 应该怎么理解? 在我看来就是,容器,在初始化时使用reserve()强制设定容器的容量,和在目标容器比源容器size()元素个数更小时,在使用的时候,如果是直接对目标容器操作,会由于目标容器与源容器大小不匹配 阅读全文
posted @ 2019-03-31 23:48 那一抹风 阅读(172) 评论(0) 推荐(0)
摘要:《条目三十一:了解各种与排序有关的选择》 1.sort template inline void sort(const _RanIt _First, const _RanIt _Last, _Pr _Pred) 全排序,整个容器排序。 2.partial_sort template inline v 阅读全文
posted @ 2019-03-31 23:48 那一抹风 阅读(681) 评论(0) 推荐(0)
摘要:条目二十八《正确理解由reverse_iterator的base()成员函数所产生的iterator的用法》 迭代器的种类一共有四种,上面已经说过了。这里就不再次写出来。 这一个条目主要是reserce_iterator和iterator的转换。可以使用base()函数来把前者转换为后者。 比如在拥 阅读全文
posted @ 2019-03-31 23:47 那一抹风 阅读(636) 评论(0) 推荐(0)
摘要:条目二十六《iterator优先于const_iterator、reverse_iterator以及const_reverse_iterator》 这几个东西不是类型来的,而是不同的类,所以强制转换的话是不行的,所以别把 C风格的强制转换类型 用在这里。 它们之间存在着隐式转换。 iterator 阅读全文
posted @ 2019-03-31 23:46 那一抹风 阅读(587) 评论(0) 推荐(0)
摘要:条目二十五《熟悉非标准的散列容器》 STL标准不没有标准的散列容器,不过我们可以使用开源的,作为STL库中非标准存在的,即将加入标准库的hast_map,hash_set。 它们在不同的厂商有不同的实现,比较常用的版本有: 1.SGI 2.Dinkumware 二者都是基于开放式散列策略。 前者是一 阅读全文
posted @ 2019-01-16 12:47 那一抹风 阅读(250) 评论(0) 推荐(0)
摘要:条目二十四《当效率至关重要时,请在map::operator[]与map::insert之间谨慎做出选择》 当效率至关重要时,应该在 和`map::insert operator[] insert`。 下面来分析为什么是这样子的。 首先先说明,下面两个式子是等价的: map ss; ss[1]=2 阅读全文
posted @ 2019-01-16 01:21 那一抹风 阅读(558) 评论(0) 推荐(0)
摘要:条目二十三《考虑用排序的vector替代关联容器》 在看到这个条目的标题的时候,说实话,我一下子是比较懵逼的。这个结论怎么和数据结构的时间复杂度不一致了? 一般来说,像map,set等关联容器的底层因为是红黑树结构,那么即使红黑树的时间复杂度并非是绝对的对数时间,但也是稳定的接近对数时间。 然而类似 阅读全文
posted @ 2019-01-16 01:17 那一抹风 阅读(304) 评论(0) 推荐(0)
摘要:条目二十一《总是让比较函数在等值情况下返回false》 这条目对序列容器是不适合的,因为序列容器就是通过等值判断来比较的。 对于关联容器来说,比较是 等价比较 ,所以要注意等值的时候,比较子的返回值。 关联容器的find、insert等都是通过 等价 来判断元素是否已存在的。 注意关联容器的等价表达 阅读全文
posted @ 2019-01-16 01:15 那一抹风 阅读(348) 评论(0) 推荐(0)
摘要:条目二十二《切勿修改set或multiset的键》 所有的标准关联容器一样,set和multiset按照一定的顺序来存放自己的元素,而这些容器的正确行为也是建立在其元素保持有序的基础之上的。如果你把关联容器中一个元素的值改变,那么元素在容器的位置就被破坏。 对于map和multimap来说,这应该是 阅读全文
posted @ 2019-01-16 01:15 那一抹风 阅读(274) 评论(0) 推荐(0)
摘要:条目二十《为包含指针的关联容器指定比较类型》 stl中的关联容器是一种动态数据结构,其数据存储方式是以内存节点方式的数据结构,具体来说一般是一种平衡二叉树(红黑树),在向关联容器插入元素的时候,容器内部为了保持树的平衡性,会自动(插入函数有自我调整代码)的调整当前插入元素的存储位置,达到动态平衡的目 阅读全文
posted @ 2019-01-16 01:14 那一抹风 阅读(291) 评论(0) 推荐(0)
摘要:《条目十九》了解相等和等价的区别 在stl标准库中,find和insert两个操作都涉及到对数据的 比较 。但是他们是两种不同的比较,前者是基于 相等 (基于 ,表达式 ),后者是基于 等价 (基于`if(!x { bool operator()(const string& lhs,const st 阅读全文
posted @ 2019-01-16 01:02 那一抹风 阅读(803) 评论(0) 推荐(0)
摘要:《条目十八》避免使用vector 先说结论: 一是: 不是标准容器,因为标准容器的对于 必须是可编译的。 二是: 并不是以单个元素为 来存储的。 在底层实现中, 中为了节省空间, 并不真的是以单个字节来存储的,而是通过 来表示的,一个位代表一个 表示。 vector不满足STL容器的必要条件,你最好 阅读全文
posted @ 2019-01-16 01:02 那一抹风 阅读(1183) 评论(0) 推荐(0)
摘要:条目十七《使用“交换技巧”来修整过剩容量》 先说原理: 创建一个临时容器,把 容器 拷贝到 临时容器 ,借用拷贝构造函数只对原容器有效元素拷贝而忽略多余的空间,然后再把临时容器和原容器的内容 互相交换 ,就达到容量尽可能修剪的目的。 记住!!!是尽可能修剪。因为容器,比如vector在底层的实现可能 阅读全文
posted @ 2019-01-16 01:01 那一抹风 阅读(226) 评论(0) 推荐(0)
摘要:《条目十六》如何将vector和string的数据传给遗留的API 优秀的代码是可以延续的,所以并非所有的代码都是重构的,而且有时候重构会对整个系统影响较大,投入巨大,得不偿失。然而,也不必为了系统的稳定而抛弃先进和方便的技术。 正如如果你想在遗留的 老代码 中想传 和`string`给形参是数组的 阅读全文
posted @ 2019-01-16 01:00 那一抹风 阅读(239) 评论(0) 推荐(0)
摘要:条目十五《注意strng实现的多样性》 下面以一个打印string空对象的大小切入本条目: include include using namespace std; int main() { string ss; printf("ss size: %ld\n", sizeof(ss)); retur 阅读全文
posted @ 2019-01-12 15:48 那一抹风 阅读(311) 评论(0) 推荐(0)
摘要:条目十三《尽量使用vector和string来代替使用数组》 数组在现代编程语言中基本都存在,应用可谓广泛,不可或缺,虽然在一些语言中(go)有切片等数据结构,但是数组还是存在的。 但是在有了stl后,在使用数组时更建议用vector和string来代替,因为在动态分配数组的内存时,需要人为的管理内 阅读全文
posted @ 2019-01-12 14:10 那一抹风 阅读(696) 评论(0) 推荐(0)
摘要:条目十二《切勿对slt容器的线性安全性又不切实际的依赖》 这一条目,我想用简短而有力的语句来总结。 stl库是为了照顾大多数情况,而不是某一领域,如果在库层次实现线性安全,很大可能是对性能有所损耗的,这样就得不偿失了,还是让开发者自己按需实现。标准没有在库实现线性安全。一般是厂商实现,可能吧,只能是 阅读全文
posted @ 2019-01-12 00:17 那一抹风 阅读(246) 评论(0) 推荐(0)