网站
cplusplus,com
cppreference.com
gcc.gnu.org
STL 六大部件(Components)
容器(containers):存放数据的地方。
分配器(allocators):数据需要内存地址需要分配器来实现,分配器一般作用在容器中
算法(algorithms): 实现数据的处理
迭代器(iterator): 数据不能处理容器,而是容器内的数据,迭代器负责区获取容器内的数据
适配器(adapters):数据之间的转换使用到适配器
仿函式(functors): 像函数的处理方式的类
容器(containers)
STL 要求容器都是“前闭后开”形式,即 container<T> c, c.begin() 指向 容器的第一个元素,c.end() 指向 容器最后一个元素的下一个空元素,不能对 c.end() 进行操作,是未知的。
顺序容器(sequence containers)
Arrary :数组,在 C++11中,将数组封装为一个类,创建大小不会在改变
Vector:向量,向量容器大小会往后增长。vector一开始的大小为0,但是随着空间的增大,空间的增长是两倍的增长。
Deque:双队列,两边都可以增长,Deque 内部实现是使用多个buf组成,空间不够,就会增加一个buf.
List:链表,内存不连接,双向链表
Forward-list: 单向链表,
关联式容器(associative containers)
关联式容器便于查找,在查找中,红黑树是一个自动调正左右两边相对于平衡的树,大部分的关联容器都使用红黑树实现。
Set/Multiset:集合,存放数据。Multiset 表示可以存放重复的值。
Map/Multimap:key-value,一个节点中分为两部分k-v。Multimap 表示可以存放重复的值。
不定序容器(unordered)
不定序容器底部是用hashtable来形成的,hashtable有一个规定是当元素的个数大于篮子个数时,篮子的个数就要往上增长。
STL容器必须要的重新定义的五个类型
目的是在算法中,算法会询问容器的类型,根据类型进行相应的运算
typedef X1 iterator_category; //适配器的类型
typedef X2 value_type; //容器存放的类型
typedef X3 difference_type;
typedef X4 pointer; //容器存放类型的指针
typedef X5 reference; //容器存放类型的引用
迭代器分类
按照移动能力进行分类:
struct output_iterator_tag { }; //输出类型
struct input_iterator_tag { }; //输入类型
struct farword_iterator_tag : public input_iterator_tag { }; //单向类型
struct bidirectional_iterator_tag : public farword_iterator_tag { };//双向类型
strcut random_iterator_tag : public bidirection_iterator_tag { }; //随机类型
各个容器属于五种类型中如下:
array 是 随机类型
vector 是 随机类型
list 是 双向类型
farword_list 是 单向类型
deque 是 随机类型(虽然内部实现是多个buff,但是使用上是随机类型)
set/multiset 是 双向类型
map/multimap 是双向类型
unordered_set/unordered_multiset / unordefed_map/ unordered_multimap 看元素的node是双向链表来实现还是单向链表实现
通过对象可以打印对象类型的
#include <typeinfo>
关键字 typeid
class A { };
A a;
cout << typeid.name(a) ;// 会打印 a对象的type类型,在c++中,我们的函数和类的名称在面一起编译后的名称不相同,但是是一 一 对应,且我们可以大体看出来。
仿函数
当我们要为STL 算法提供自己的仿函数时。我们的 类要继承 一下两个类。继承之后适配器就可以回答适配的询问,这个逻辑像算法询问迭代器,迭代器必须要有相应的typedef 相应的数据类型一样。
template<class Args, class Result>
struct unary_function{
typedef Arg argument_type;
typedef Result result_type;
};
template<class Arg1, class Arg2, class Tesult>
struct binary_function{
typedef Arg1 first_argument_type;
typedef Arg2 second_argument_type;
typedef Result result_type;
};
适配器