STL概述
STL头文件和容器类
#include Container Class
<deque> deque
<list> list
<map> map, multimap
<queue> queue, priority_queue
<set> set, multiset
<stack> stack
<vector> vector
相关重要概念
- 尽管具有多重继承的基于对象的层次结构在观念上是最直接的,但是在实际上较为困难.基于对象层次的一种更可取的选择:包容器类被作为参数化类型的大型预处理宏,而不是带自变量的模板,这些自变量能为我们所希望的类型代替
- 对其进行简化并将它从预处理范围移入了编译器,这种新的代码替换装置被称为模板,而且它表现了完全不同的代码重用方法,模板对源代码进行复用,而不是通过继承和组合重用对象代码,当用户使用模板时,参数由编译器来替换,这非常像原来的宏方法,却更清晰,更容易使用
- 模板使用类和函数可在编译时定义所需要处理和返回的数据类型,一个模板并非一个实实在在的类或函数,仅仅是一个类或函数的描述.由于模板可以实现逻辑相同,数据类型不同的程序代码复制,所以使用模板机制可以减轻编程和维护的工作量和难度.模板一般为函数模板,和类模板,函数模板定义了参数化的非成员函数,这使得程序员能够用不同类型的参数调用相同的函数,由编译器决定该用那一种类型,并且从模板函数中生成相应代码,所以只要类型不一样,但是处理上是完全相同的,这时可以使用函数模板
STL 的五大部分
- 迭代器(iterators)
- 算法(algorithms)
- 容器(containers)
- 函数对象(function objects)
- 内存分配(allocators)
函数模板功能非常强大,但是有时候可能会陷入困境,假如待比较的函数模板没有提供正确的操作符,则程序不会对此进行编译,可以使用函数模板与同名的非模板函数重载,这就是函数的制定.函数模板与同名的非模板函数重载必须遵循以下的规则
- 寻找一个参数完全匹配的函数,如果找到就调用它;
- 如果失败,寻找一个函数模板,使其实例化,产生一个匹配的模板函数,如果找到了,就调用它
- 如果失败了,再试低一级的对函数重载的方法,例如通过类型转换可产生的参数匹配等,如果找到了匹配的函数,就调用它
- 如果失败了,则证明这是一个错误调用
模板中的友元函数
- 非模板函数,类成员所有实例的友元
- 模板函数,模板类成为同类型实例的友元
- 模板函数,类成为不同类型实例类的友元
STL 的容器
说明:
- vector<T> 是一种大小不可变的向量
- list<T> 是一个双向链表容器
- queue<T> 是一种队列容器
- stack<T> 是一种栈容器
- deque<T> 是一种双端队列容器
- priority_queue<T> 是一种按值排序的队列容器
- set<T> 是一种集合容器
- multiset<T> 是一种充许出现重复元素的集合容器
- map<key,val> 是一种关联数组容器
- multimap<key,val> 是一种充许出现重复key值的关联容器
迭代器
简介:
无论从何种意义上来说,都可以认为迭代器就是一个指示器,然而,迭代器技术能够使程序反复对STL容器的内容进行访问,所以非常快捷和重要,对容器的内容进行反复地访问,意味着一次就可以访问一个或多个元素
分类:
- 输入迭代器: 主要用于为程序中需要的数据源提供输入接口,这里所指的数据源可以是容器,数据流等,输入迭代器只能够一个序列读入数据,这种迭代器可以被修改,并且以并进行比较
- 输出迭代器: 主要用于输出程序中已得到的数据结果,这里指的结果可以是容器,数据流等,输出迭代器只能够向一个序列写入数据,这种迭代器可以被修改和引用
- 向前迭代器: 可以随意访问序列中的元素,许多STL算法函数需要提供向前迭代器,向前迭代器既可以用来读也可以用来写,这种迭代器结合了输入输出迭代器的功能,并且能够保证迭代器的值,以便从起原先位置开始重新遍历
- 随机接入迭代器: 可以通过跳跃的方式访问容器中得任意数据,从而使数据的访问非常灵活,随机访问迭代器作为功能最强大的迭代器类型,具有双向迭代器的所有功能,并且能够灵活使用算法和所有的迭代器比较功能
说明:
- 迭代器的出现让算法和容器的分离成为可能,算法是模板,器类型依赖于迭代器,因此不会局限于单一的容器
- 不同的STL算法需要不同类型的迭代器来实现相应的功能,因为不同类型的STL容器支持不同类型的迭代器,所以不能对所有的容器使用相同的算法
区别:
迭代器类型 迭代器能力 支持的容器类型
输入迭代器(input iterator) 向前读取能力 istream
输出迭代器(output iterator) 向前写能力 ostream,inserter
向前迭代器(forward iterator) 向前读和写能力 -
双向迭代器(Bidirectional iterator) 向前和方向读和写能力 list,set,multiset,map,multimap
随机访问迭代器(Random access iterator) 随机读和写能力 vector,deque,string等