STL的组成:
容器分为 顺序容器 和 关联容器
有序关联容器的实现原理和 红黑树 有关
无序关联容器的实现原理和 哈希表 有关
迭代器、算法、适配器(Adapters) 、空间配置器(allocators)、仿函数(Functors)
1、容器注意std::find返回的是一个迭代器
MAP
注意,这里的下标不一定是数字,map很像python中的dictionary
2、迭代器插入迭代器
必须保证v2里面有足够的空间!!STL中很多算法都不会改变容器的空间
用resize来改变空间即可!
尾插元素:
利用插入迭代器back_inserter
类似于对v2进行多次push_back
流迭代器 stream iterators
eof表示输入流的终止
这些迭代器都定义在头文件
复习:iterator catogories
可以拿forward-iterators反反复复的遍历序列
但是input-iterators是一次性的,输入的数据读了就没了
所以上面个的这个问题,对于forward是对的,但对于input就不对,因为对于input在解引用之后iter就没了
3、特殊算法对于链表来说,std::sort做不到
因为链表提供的是bidireactional iterator,而不是random的
链表排序,用std::list::sort就可以啦!
好处:不要求链表数据可交换,而且是稳定排序
稳定排序:相同关键字的元素在排序后相对位置保持不变
链表的操作↑
4、空间配置器提供一套统一的接口
例如,vector默认使用标准的std::allocator
而我也可以写一个自己的特殊的空间配置器
二、运算符重载
1、函数调用运算符
注意上面有三个运算对象:adder, 42, 35
注意:当我们把重载的函数写成成员函数时,这n个运算对象中最左边的那个会绑定到this指针,从第二个运算对象开始才会从左到右依次绑定到参数上
Adder{} 或者Adder() 就是默认构造了一个对象
这样的类的对象 就是一个仿函数 (装的像个函数一样)
它的意义是什么?
如下面的应用场景:
2、算术 关系运算符
因为0肯定不是一个对象,没有0==(r)
所以说,当所有参数都需要隐式转换时,应该把函数设置成非成员
3、递增递减运算符
研究一下加加
加加 减减 都是单个运算对象 通常把函数定义为成员函数,因为要改变成员的状态
其中,后置递增运算符的重载中
这个int只是一个占位符 tag 表示这是后置递增运算符 没有额外的意义
显然,前置递增运算符返回的是自身的引用
而后置递增运算符返回的是拷贝的递增之前的对象
很妙的地方,是后置递增的重载中依赖了前置递增
这样debug很方便
4、解引用、箭头运算符
箭头运算符重载比较特殊,就是这么个格式,记住就行
为什么要用addressof呢?(定义在
因为我们不知道T到底是个什么类型,万一这个类型重载了取地址运算符,就糟糕了
而addressof能保证一定能娶到地址
5. 类型转换运算符重载
注意这个重载函数中 返回值类型可以不写 因为肯定是double
但是 也会有问题出现:
下面会出现一个奇怪的能够通过编译的情况:
因为std::cin会变成bool,bool变成int,两个int通过<<进行移位的操作
为了禁止这种隐式的类型转换,我们引入explicit
避免二义性



