STL包括容器,算法和迭代器
STL的模板类为c++提供了完善的数据结构,它的模板类的样式就好象数据结构中用类c或者类c++或者类
容器和算法就是数据结构的数据组织和操作,而迭代器则是为了容器和算法分离而专门设计的,它就像是循环里用的指针,但是在任何情况下,STL算法都是用迭代器来处理容器的。
以vector 为例,vector s;它们的迭代器是这样:vector::iterator it;它们的插入是insert()或者put()或者add()等函数。s.begin()和s.end()都是返回的迭代器类型,s.end()不是指向最后一个元素,而是再后面一个。对应的find()函数返回的通常都是迭代器。而set()函数是修改特定位置的值。
容器的种类
第一种分类方法:
1. 序列式容器:包括vector ,deque,list,所谓序列式就是容器中的值都是有相对位置的,也就是可以随机存取,vector ,deque直接提供了[ ]下标的操作符,而list没有,但是它就是一个双向链表,在随机插入删除方面很有效。
vector就是数据结构中的堆,由一个起始地址elemtype *start ,和int length组成,所以可以随机存取,而且动态分配大小,但是头插入和尾插入的效率是不同的。而deque就像循环队列,随机存取,头插入和尾插入都一样。
它们的迭代器都是随机存取的迭代器,所以对于sort()等函数都是可以用的。
2. 关联式容器
标准关联式容器:包括set,map ,以及对应的容许有重复值的multiset和multimap。它们是通过键值得到结果的,而不是通过序列。
还有非标准的关联式容器:hash_set、hash_multiset、hash_map和hash_multimap。
关联式容器是基于数据结构的树形结构建立的,平衡树或者排序树。
第二种分类方法
1. 连续内存存放
vector ,edque,String都是典型的连续内存存放,所以它们的随机存取很方便,效率也很高,但是插入删除就差一些了。
2. 链表式的节点存放。
基于节点的容器的优缺点正好相反,典型的是list,树形的set和map当然也是,但是它们不是一般的链表。至于stack,queue,它们的实现可以是链式的也可以是顺序的。
容器适配器
stack,queue,priority_queue(优先队列),这三种被称作容器适配器,它们是利用基本容器衍生出来的。stack衍生自deque,queue衍生自deque,priority_queue衍生自vector.
栈和队列是我们很熟悉的,它们没有随机存取,只有push,pop,front,top等用法,如果想遍历的话,就需要把前一个先pop出来,于是也就有了queue和priority_queue的区别。queue输出的时候就是按照你push的顺序,但是priority_queue却是默认按照降序输出,即使还没有pop调用front,输出的也是最大的那一个。也就是它在你push时已经进行了排序。这就是“优先级”的意义。
STL算法
STL算法也就是在数据结构里经常遇到的算法操作:查找,排序,复制
算法的参数都是基于迭代器,而不是具体的容器