STL--概述:
标准模板库(StandardTemplateLibrary,STL),是C++程序设计语言标准模板库。STL是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。虽然它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。
STL是所有C++编译器和所有操作系统平台都支持的一种库,包含了很多在计算机科学领域里所常用的基本数据结构和基本算法,为广大C++程序员提供了一个可扩展的应用框架,高度体现了软件的可复用性。
对所有的编译器来说,提供给C++程序设计者的接口都是一样的。也就是说同一段STL代码在不同编译器和操作系统平台上运行的结果都是相同的,但是底层实现可以是不同的,使用者并不需要了解它的底层实现。
使用STL的应用程序保证得到的实现在处理速度和内存利用方面都是高效的,因为STL设计者们已经考虑好了。
使用STL编写的代码更容易修改和阅读。因为代码更短,很多基础工作代码已经被组件化了;使用简单,虽然内部实现很复杂。
STL是建立在模板函数和模板类基础之上的功能强大的库。
模板函数可以实现一般化的常用算法(如统计、排序、查找等)
模板类可以实现支持几乎所有类型的容器,用来实现常用的数据结构(如链表、栈、队列、平衡二叉树等)
STL 头文件一览表:
头文件
|
内容
|
头文件
|
内容
|
<iterator>
|
迭代器
|
<vector>
|
向量
|
<utility>
|
辅助功能
|
<deque>
|
双头队列
|
<memory>
|
内存管理
|
<list>
|
链表
|
<algorithm>
|
算法
|
<set>
|
集合与多重集合
|
<functional>
|
函数对象
|
<map>
|
映射与多重映射
|
<numeric>
|
数值运算
|
<stack>
|
栈
|
|
|
<queue>
|
队列与优先队列
|
迭代器的定义和种类:
n迭代器(iterator)实际上是一种一般化的指针类型,是对指针类型的抽象。
n根据所支持操作的不同,迭代器被分为五大类:
¨输出迭代器(input iterator)
¨输入迭代器(output iterator)
¨前向迭代器(forward iterator)
¨双向迭代器(bidirectional iterator)
¨随机迭代器(random access iterator)
各种迭代器的功能
迭代器类型
|
输出迭代器
|
输入迭代器
|
前向迭代器
|
双向迭代器
|
随机迭代器
|
缩写
|
Out
|
In
|
For
|
Bi
|
Ran
|
读取
|
不支持
|
x = *p
|
x = *p
|
x = *p
|
x = *p
|
操作
|
不支持
|
p->x
|
p->x
|
p->x
|
p->x p[i]
|
写入
|
*p = x
|
不支持
|
*p = x
|
*p = x
|
*p = x
|
迭代
|
++
|
++
|
++
|
++ --
|
++ -- + - += -=
|
比较
|
不支持
|
== !=
|
== !=
|
== !=
|
== != < > <= >=
|
更多关于迭代器的信息:
指针类型就是一种特殊的随机迭代器类型。
对于一般的迭代器,这些功能都是通过操作符重载来实现的。
各种迭代器类型之间的关系:
输出迭代器
随机迭代器---》双向迭代器---》向前迭代器---》
输入迭代器
迭代器的作用
¨访问元素
¨算法与容器之间的纽带
与算法有关的知识:
算法(algorithm)
¨每个算法都是一个或者一组模板函数,用来完成一项特定的操作。
序列(sequence)
¨序列用两个迭代器来描述,表示一组连续的元素;其中,第一个迭代器指向序列中的第一个元素,第二个迭代器指向序列最后一个元素的后一个位置。
函数对象(function object)
¨函数对象重载了函数调用操作符(operator ()),可以像普通函数一样被使用。
谓词(predicate)
¨返回值类型为bool的函数对象
常用函数对象:
STL在头文件<functional>中提供了一些常用运算的函数对象。
类名
|
类型
|
作用
|
equal_to
|
双目
|
arg1 == arg2
|
not_equal_to
|
双目
|
arg1 != arg2
|
greater
|
双目
|
arg1 > arg2
|
less
|
双目
|
arg1 < arg2
|
greater_equal
|
双目
|
arg1 >= arg2
|
less_equal
|
双目
|
arg1 <= arg2
|
logical_and
|
双目
|
arg1 && arg2
|
logical_or
|
双目
|
arg1 || arg2
|
logical_not
|
单目
|
!arg
|
plus
|
双目
|
arg1 + arg2
|
minus
|
双目
|
arg1 - arg2
|
multiplies
|
双目
|
arg1 * arg2
|
divides
|
双目
|
arg1 / arg2
|
modulus
|
双目
|
arg1 % arg2
|
negate
|
单目
|
-arg
|
STL算法一览:
访问元素类
¨for_each(), transform()
顺序查找类
¨find(), find_if(), find_first_of(), adjacent_find(), search(), find_end(), search_n()
统计类
¨count(), count_if()
比较类
¨mismatch(), equal(), lexicographical_compare()
复制类
¨copy(), copy_backward()
交换类
¨swap(), iter_swap(), swap_ranges()
替换类
¨replace(), replace_if(), replace_copy(), replace_copy_if()
填充发生类
¨fill(), fill_n(), generate(), generate_n()
删除类
¨remove(), remove_if(), remove_copy(), remove_copy_if
去重类
¨unique(), unique_copy()
反转类
¨reverse(), reverse_copy()
旋转类
¨rotate(), rotate_copy()
随机打乱类
¨random_shuffle()
排序类
¨sort(), stable_sort(), partial_sort(), partial_sort_copy(), nth_element()
二分查找类
¨lower_bound(), upper_bound(), equal_range(), binary_search()
合并类
¨merge(), inplace_merge()
¨partition(), stable_partition()
集合运算类
¨includes(), set_union(), set_intersection(), set_difference(), set_symmetric_difference()
堆操作类
¨make_heap(), push_heap(), pop_heap(), sort_heap()
最大最小类
¨min(), max(), min_element(), max_element()
排列类
¨next_permutation(), prev_permutation()
数值运算类
¨accumulate(), inner_product(), partial_sum(), adjacent_difference()
常用STL容器
名称
|
描述
|
所在头文件
|
迭代器类型
|
vector
|
向量
|
<vector>
|
随机迭代器
|
deque
|
双头队列
|
<deque>
|
随机迭代器
|
list
|
链表
|
<list>
|
双向迭代器
|
stack
|
栈
|
<stack>
|
不提供迭代器
|
queue
|
队列
|
<queue>
|
不提供迭代器
|
priority_queue
|
优先队列
|
<queue>
|
不提供迭代器
|
set
|
集合
|
<set>
|
双向迭代器
|
multiset
|
多重集合
|
<set>
|
双向迭代器
|
map
|
映射
|
<map>
|
双向迭代器
|
multimap
|
多重映射
|
<map>
|
双向迭代器
|
一般容器:
vector deque list
容器适配器:
栈stack
队列queue
优先队列priority_queue
关联容器:
元素有序
用平衡二叉树实现
类名:set, multiset, map, multimap
分类
¨按元素构成来分
集合:元素本身就是关键字,直接参与排序
映射:元素由关键字和被映射的值构成,只有关键字参与排序
¨按关键字能否重复来分
普通:关键字不能重复
多重:关键字允许重复
关联容器的特殊成员函数:
查找类
¨find()
¨lower_bound()
¨upper_bound()
¨equal_range()
复合类
¨operator []()
STL的优缺点:
优点:
¨降低编程复杂度
¨提高代码的正确率
缺点:
¨编译时会出各种错误
¨给动态调试增加难度
给几条建议吧:
多用STL的算法
优先使用内置数组
多用静态查错
动态查错时向屏幕输出
小节:
STL以面向对象的程序设计和一般化编程为基础,提供了功能强大的算法和容器,并通过迭代器把这两部分有机地结合起来