随笔分类 - Effective STL
摘要:条目十一《理解自定义分配子的合理用法》 根据大牛们的测试: STL默认的内存管理器(allocator)太慢,或者浪费内存,或者在使用的时候会产生内存碎片。 又或者需求不一样时: 1.allocator是多线程安全的,而你运行环境是单线程,所以想减少线程同步带来的te不必要开销。 2.当想把容器的对
阅读全文
摘要:条目十《了解分配子(allocator)的约定和限制》 在STL标准库中,分配子的存在有点怪异。 一开始的设计意图是提供一个内存模型的抽象,让使用库者库忽略操作系统的near指针和far指针问题。但此目的没有达到。另一个目的是为了有利于开发作为对象形式存在的内存管理器。 从书中的这句话,其实我咋一看
阅读全文
摘要:慎重选择删除元素的方法 不同容器删除元素的方法是有区别的。 对于删除容器里的一个元素 序列容器( string, vector, deque)最高效的方法是erase remove。 list最高效的方法是remove。 关联容器没有remove成员函数,只有erase,直接用erase函数来删除元
阅读全文
摘要:条目八《永不建立auto_ptr的容器》 重要的事说三次,永不建立auto_ptr的容器,永不建立auto_ptr的容器,永不建立auto_ptr的容器!!! 为什么? 实质是 指针在转移时把原本的指针置为NULL,然而在STL容器中的一些操作是包含数据转移操作的。 比如 排序sort() ,在ST
阅读全文
摘要:STL
阅读全文
摘要:当心C++编译器中最烦人的分析机制 C++是较为底层的面相对象语言,在底层的语法规则分析中,有很多隐藏的分析机制。 C++中的普遍规律相符,即尽可能地解释为函数声明。 把形式参数的声明用括号括起来是非法的,但给函数参数加上括号却是合法的,所以通过增加一对括号,我们强迫编译器按我们的方式来工作。 例如
阅读全文
摘要:条目五《尽量使用区间成员函数代替它们的单元素兄弟》 assign成员函数 主要是用于赋值,不像operator=只能拷贝一个同类型的容器,assign函数可以是赋值新的元素 。 对所有标准序列容器(vector,string,deque和list)都有效。无论何时你必须完全代替一个容器 的内容,你就
阅读全文
摘要:条目四《用empty来代替检查size()是否为0》 首先先说结论: empty()实现为内联函数。(众所周知, 优秀的内联函数的效率比一般函数是高的) 在stl标准库中,empty()对所有容易的时间复杂度是常数时间, 而对于一些list实现,size()是线性时间的。 基于以上两点, 在实际使用
阅读全文
摘要:前两天看的《海王》,真的真的非常好看,全程无尿点。 在STL中,底层操作的都是容器存储的对象的副本。也即,对于STL而言,进去和出来都是一个对象副本。而且在STL的所有操作也只是对存储对象的副本的移动,删除等。 有副本的复制行为,证明必定有拷贝构造函数和赋值操作符重载函数的存在。如果我们没有显示的声
阅读全文
摘要:条目二主要是讲了STL的各个容器就是一个个已经泛化的抽象实体,每种容器就是一个容器类型,他们都有属于自己的特点,我们不应该在现有的容器类型外,基于现有的容器类型混合和裁剪各个容器的所属特点来再次泛化一个通用的容器类型。 这么做是不可取的。我个人觉得条目二是针对“中牛们🐮”说的,因为“小牛们”只会用
阅读全文
摘要:条目一主要是先抛出选择STL容器时面对的问题,并且从中简单的对各个容器做个分类和使用对比。 在选择stl容器类型的时候,一般需要从以下的角度来考虑选择对象: 1.元素的排序情况 2.是否与标准相符 3.迭代器的能力 4.元素布局与C的兼容性 5.查找速度 6.因引用计数数所引起的反常行为 7.是否便
阅读全文

浙公网安备 33010602011771号