STL学习小记

来源:互联网 发布:人工智能 电影 编辑:程序博客网 时间:2024/05/16 05:32

STL学习小记

 387人阅读 评论(0) 收藏 举报
STL(Standard Template Libarary)主要提供了三类工具:容器container,迭代器iterato,算法algorithm.
STL提供了两类容器:
            序列容器——以线性序列方式组织对象;
            关联容器——用关联的键把对象组织在一起。
关联容器(Associative Container)与顺序容器(Sequential Container)的本质区别在于:关联容器是通过键(Key)存储和读取元素的,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。关联容器支持通过键值来高效地查找和读取元素,两个基本的关联容器是map和set。map的元素是“键-值”对的二元组形式:键用作元素在map中的索引,而值则表示所存储和读取的数据。set仅包含一个键,并有效地支持关于某个键是否存在的查询。set和map类型的对象所包含的元素都具有不同的键。如果需要一个键对应多个实例,则需要使用multimap或multiset类型。这两种类型允许多个元素拥有相同的键。
序列容器:有三种基本类型,分别对应于模版vector<T>,deque<T>和list<T>。他们都存储了一组特定类型T的对象,这些对象以线性序列方式组织,但每个容器都可以访问以不同方式优化的内容。
vector<T>动态的增加对象的个数,他的大小小于或者等于他的容量。他在尾部删除和添加是最高效的,相当于简单的数组的组织方式。
deque<T>动态的增加对象的个数,他的大小等于它的容量,他没有capacity()成员函数,他在两端添加和删除是最高效的。他和vector<T>一样在中间添加和删除,过程比较慢,需要复制已有的元素。由于内部组织方式不同,deque容器用起来比vector容器略慢。
list<T>的内部组织方式是双向链表,可以在序列的任意位置高效的插入和删除元素。他的主要限制是随机访问元素比较慢,因为这需要从list的第一个元素或者最后一个元素开始遍历整个list,查找每个元素。
所以要根据他们的特点来选择合适的容器。
关联容器:允许使用健存储和提取综合类型的对象。
关联容器有四个基本类型:map<Key,T>,multimap<Key,T>,set<Key>和multiset<Key>。
下略:
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头文件:
<vector>:单端口数组容器
<deque>:双端口数组容器
<list>:双向链表容器
<map>:map和multimap关联数组容器
<set>:set和multiset已排序的设置容器
<bitset>:表示位序列的对象
<queue>:双端口队列(容器适配器)
<stack>:堆栈(容器适配器)
支持迭代器,需要头文件<iterator>,容器头文件中包含迭代器头文件;<map>头文件包含<utility>头文
件,这个头文件中包含定义和管理map和multimap容器所使用的键/值对所需的声明。
算法的声明在头文件<algorithm>中,函数对象的支持由<functional>头文件的声明提供。
数值算法在头文件<numeric>中声明,另外还有<complex>头文件提供复杂数字的支持,<valarray>头文件提供了数值数组的支持。
另外在流文件集合中还声明了一些迭代器,如:<iostream>,<istream>,<ostream>,<sstream>。这些头文件利用STL支持基于基本STL算法的输入输出。
原创粉丝点击