STL
标准模板库(Standard Template Library,STL),STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。
STL的代码广义上分为algorithm算法,container容器,iterator迭代器;几乎所有代码采用模板类和模板函数的方式,提供了更好的代码重用。在C++标准中,STL被组织为下面的13个头文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。
iterator迭代器
迭代器是一种对象,它能够遍历STL容器中的部分或全部元素。每个迭代器对象代表容器中确定的地址。
它提供了一些基本操作符:*、++、==、!=、=,迭代器是个所谓的复杂指针,具有遍历复杂数据结构的能力
迭代器是一种检查容器内元素并遍历元素的数据类型
Java中的Iterator
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
Java中的Iterator功能比较简单,并且只能单向移动:
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。
Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。
container容器
C++中容器就是一种用来存放数据的对象。其实就是容器类实例化之后的一个具体的对象,把这个对象看成一个容器,容器可以自行扩展(动态)
容器分为三类:
顺序容器:vector,deque,list
vector向量:连续存储的元素
list列表:由结点组成的双向链表
deque双端队列:连续存储的指向不同元素的指针所组成的数组
[deque是双端数组,而vector是单端的。
deque在接口上和vector非常相似,在许多操作的地方可以直接替换。
deque可以随机存取元素,索引值直接存取.
deque头部和尾部添加或移除元素都非常快速。但是在中部安插元素或移除元素比较费时。]
关联容器:set,multiset,map,multimap
set集合:有节点组成的红黑树,每个节点都包含一个元素,节点之间以某种因素排列,没有两个不同的元素能够拥有相同的次序 <set>
multiset多重集合:允许存在两个次序相等的元素的集合 <set>
map映射:由{键,值}对组成的集合,键对上以某种因素排列 <map>
多重映射(multimap) 允许键对有相等的次序的映射 <map>
[map:它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。根据key值快速查找记录,查找的复杂度基本是Log(N),]
容器适配器:stack,queue
stack栈:后进先出的值的排列 <stack>
queue队列:先进先出的值的排列 <queue>
algorithm算法
STL提供了大约100个实现算法的模版函数,比如算法for_each将为指定序列中的每一个元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。这样一来,只要我们熟悉了STL之后,许多代码可以被大大的化简,只需要通过调用一两个算法模板,就可以完成所需要的功能并大大地提升效率。
算法部分主要由头文件<algorithm>,<numeric>和<functional>组成。<algorithm>是所有STL头文件中最大的一个:
常用算法汇总
l 常用的查找算法:
adjacent_find()(adjacent 是邻近的意思)binary_search(),count(),count_if(), find(), equal_range(),find_if()。
l 常用的排序算法:
merge(),sort(),random_shuffle()(shuffle是洗牌的意思) ,reverse()。
l 常用的拷贝和替换算法:
copy(), replace(), replace_if(),swap()
l 常用的算术和生成算法:
accumulate()( accumulate 是求和的意思),fill(),。
l 常用的集合算法:
set_union(),set_intersection(), set_difference()。
l 常用的遍历算法:
for_each(), transform()( transform 是变换的意思)