STL(Standard Template Libarary)主要提供了三类工具:容器container,迭代器iterato,算法algorithm.
STL提供了两类容器:
序列容器——以线性序列方式组织对象;
关联容器——用关联的键把对象组织在一起。
关联容器(Associative Container)与顺序容器(Sequential Container)的本质区别在于:关联容器是通过键(Key)存储和读取元素的,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。关联容器支持通过键值来高效地查找和读取元素,两个基本的关联容器是map和set。map的元素是“键-值”对的二元组形式:键用作元素在map中的索引,而值则表示所存储和读取的数据。set仅包含一个键,并有效地支持关于某个键是否存在的查询。set和map类型的对象所包含的元素都具有不同的键。如果需要一个键对应多个实例,则需要使用multimap或multiset类型。这两种类型允许多个元素拥有相同的键。
序列容器:有三种基本类型,分别对应于模版vector,deque和list。他们都存储了一组特定类型T的对象,这些对象以线性序列方式组织,但每个容器都可以访问以不同方式优化的内容。
vector动态的增加对象的个数,他的大小小于或者等于他的容量。他在尾部删除和添加是最高效的,相当于简单的数组的组织方式。
deque动态的增加对象的个数,他的大小等于它的容量,他没有capacity()成员函数,他在两端添加和删除是最高效的。他和vector一样在中间添加和删除,过程比较慢,需要复制已有的元素。由于内部组织方式不同,deque容器用起来比vector容器略慢。
list的内部组织方式是双向链表,可以在序列的任意位置高效的插入和删除元素。他的主要限制是随机访问元素比较慢,因为这需要从list的第一个元素或者最后一个元素开始遍历整个list,查找每个元素。
所以要根据他们的特点来选择合适的容器。
关联容器:允许使用健存储和提取综合类型的对象。
关联容器有四个基本类型:map,multimap,set和multiset。
下略:
STL迭代器,下面迭代器的功能是累加的,输入输出迭代器功能最弱,随机访问迭代器功能最强。
输入输出迭代器:用于读取一些列的对象,且只能使用一次。如需要二次读写序列,就必须创建一个新的输入输出迭代器。
向前迭代器:合并了输入输出迭代器,可以多次使用。
双向迭代器:与向前迭代器一样,但可以向前向后遍历一系列对象。
随机访问迭代器:提供的功能和双向迭代器相同,还可以随机读写元素。
每种迭代器在运算方面都有限制。
不同的容器支持不同的迭代器。
vector和deque容器支持随机访问迭代器;List,map,multimap,set,multiset容器支持双向迭代器。
STL算法:
STL算法是STL中最大的工具集合。不是所有的算法都和应用程序有关,其中的一些算法还有专门的用途。
算法主要分为三大类:
1:不修改序列的操作:find(),find_end(),find_first(),adjacent_find(),count(),mismatch(),search(),equal();
2:修改序列的操作:修改序列中的元素。swap(),copy(),transform(),replace(),remove(),reverse
(),rotate(),fill(),radom_shuffle();
3:排序、合并和相关的操作:在一些情况下会改变序列的顺序。sort(),stable_sort(),binary_search
(),merge(),min(),max(),lexicographical_compare().
数值算法:accumulate<>,adjacent_difference<>,inner_product<>,partial_sum<>.
函数对象:重载了函数调用运算符operator()的类对象,专门用于作为参数传送给函数,其效率比使用原始的函数指针更高。
STL头文件:
:单端口数组容器
:双端口数组容器
:双向链表容器
件,这个头文件中包含定义和管理map和multimap容器所使用的键/值对所需的声明。
算法的声明在头文件
中,函数对象的支持由头文件的声明提供。
数值算法在头文件中声明,另外还有头文件提供复杂数字的支持,头文件提供了数值数组的支持。
另外在流文件集合中还声明了一些迭代器,如:,,,。这些头文件利用STL支持基于基本STL算法的输入输出。