STL定义了强大的、基于模板的、可复用的组件,实现了许多通用的数据结构及处理这些数据结构的算法。其中包含三个关键组件——容器(container,流行的模板数据结构)、迭代器(iterator)和算法(algorithm)。ios
组件 | 描述 |
---|---|
容器 | 容器是用来管理某一类对象的集合。C++ 提供了各类不一样类型的容器,好比 deque、list、vector、map 等。 |
迭代器 | 迭代器用于遍历对象集合的元素。这些集合多是容器,也多是容器的子集。 |
算法 | 算法做用于容器。它们提供了执行各类操做的方式,包括对容器内容执行初始化、排序、搜索和转换等操做。 |
STL容器,可将其分为四类:序列容器、有序关联容器web
序列容器:算法
标准库容器类 | 描述 |
---|---|
array | 固定大小,直接访问任意元素 |
deque | 从前部或后部进行快速插入和删除操做,直接访问任何元素 |
forward_list | 单链表,在任意位置快速插入和删除 |
list | 双向链表,在任意位置进行快速插入和删除操做 |
vector | 从后部进行快速插入和删除操做,直接访问任意元素 |
有序关联容器(键按顺序保存):数组
标准库容器类 | 描述 |
---|---|
set | 快速查找,无重复元素 |
multiset | 快速查找,可有重复元素 |
map | 一对一映射,无重复元素,基于键快速查找 |
multimap | 一对一映射,可有重复元素,基于键快速查找 |
无序关联容器:数据结构
标准库容器类 | 描述 |
---|---|
unordered_set | 快速查找,无重复元素 |
unordered_multiset | 快速查找,可有重复元素 |
unordered_map | 一对一映射,无重复元素,基于键快速查找 |
unordered_multimap | 一对一映射,可有重复元素,基于键快速查找 |
容器适配器:dom
标准库容器类 | 描述 |
---|---|
stack | 后进先出(LIFO) |
queue | 先进先出(FIFO) |
priority_queue | 优先级最高的元素先出 |
序列容器描述了线性的数据结构(也就是说,其中的元素在概念上” 排成一行"), 例如数组、向量和 链表。关联容器描述非线性的容器,它们一般能够快速锁定其中的元素。这种容器能够存储值的集合或 者键-值对。C++11中,关联容器中的键是不可变的(不能被修改)。序列容器和关联容器一块儿称为首类 容器。栈和队列都是在序列容器的基础上加以约束条件获得的,所以STL把stack和queue做为容器适配 器来实现,这样就可使程序以一种约束方式来处理线性容器。类型string支持的功能跟线性容器同样, 可是它只能存储字符数据。svg
除此以外,有一些其余的容器种类被称为“ 近容器" (near con即ner): C类型的基于指针的数组用于维护标志位的 bitset, 以及用千进行高速向量运算的 valarray( 这个类对运算进行了优化,也不像首类容器那么复杂)。 这些类型称为“近容器”,是由于它们展示出来的功能与首类容器相似,可是不支持全部的首类容器的功能。函数
迭代器在不少方面与指针相似,也是用于指向首类容器中的元素(还有一些其余用途,后面将会提到)。 迭代器存有它们所指的特定容器的状态信息,即迭代器对每种类型的容器都有一个实现。 有些迭代器的操做在不一样容器间是统一的。 例如,*运算符间接引用一个迭代器,这样就可使用它所指向的元素。++运算符使得迭代器指向容器中的下一个元素(和数组中指针递增后指向数组的下一个元素相似)。工具
STL 首类容器提供了成员函数 begin 和 end。函数 begin 返回一个指向容器中第一个元素的迭代器,函数 end 返回一个指向容器中最后一个元素的下一个元素(这个元素并不存在,经常使用于判断是否到达了容器的结束位仅)的迭代器。 若是迭代器 i 指向一个特定的元素,那么 ++i 指向这个元素的下一个元素。* i 指代的是i指向的元素。 从函数 end 中返回的迭代器只在相等或不等的比较中使用,来判断这个“移动的迭代器” (在这里指i)是否到达了容器的末端。测试
使用一个 iterator 对象来指向一个能够修改的容器元素,使用一个 const_iterator 对象来指向一个不能修改 的容器元素。
类型 | 描述 |
---|---|
随机访问迭代器(random access) | 在双向迭代湍基础上增长了直接访问容器中任意元素的功能, 便可以向前或 向后跳转任意个元素 |
双向迭代器(bidirectional) | 在前向迭代器基础上增长了向后移动的功能。支持多遍扫描算法 |
前向迭代器(forword) | 综合输入和输出迭代器的功能,并能保持它们在容器中的位置(做为状态信息),可使用同一个迭代器两次遍历一个容器(称为多遍扫描算法) |
输出迭代器(output) | 用于将元素写入容器。 输出迭代楛每次只能向前移动一个元索。 输出迭代器只支持一遍扫描算法,不能使用相同的输出迭代器两次遍历一个序列容器 |
输入迭代器(input) | 用于从容器读取元素。 输入迭代器每次只能向前移动一个元素。 输入迭代器只支持一遍扫描算法,不能使用相同的输入迭代器两次遍历一个序列容器 |
每种容器所支持的迭代器类型决定了这种容器是否能够在指定的 STL 算 法中使用。 支持随机访问迭代器的容器可用千全部的 STL 算法(除了那些须要改变容器大小的算法,这样的算法不能在数组和 array 对象中使用)。 指向 数组的指针能够代替迭代器用于几乎全部的 STL 算法中,包括那些要求随机访问迭代器的算法。 下表显示了每种 STL 容器所支持的迭代器类型。 注意, vector 、 deque 、 list 、 set 、 multiset 、 map 、 multimap( 首类容器)以及 string 和数组均可以使用迭代韶遍历。
容器 | 支持的迭代器类型 | 容器 | 支持的迭代器类型 |
---|---|---|---|
vector | 随机访问迭代器 | set | 双向迭代器 |
array | 随机访问迭代器 | multiset | 双向迭代器 |
deque | 随机访问迭代器 | map | 双向迭代器 |
list | 双向迭代器 | multimap | 双向迭代器 |
forword_list | 前向迭代器 | unordered_set | 双向迭代器 |
stack | 不支持迭代器 | unordered_multiset | 双向迭代器 |
queue | 不支持迭代器 | unordered_map | 双向迭代器 |
priority_queue | 不支持迭代器 | unordered_multimap | 双向迭代器 |
下表显示了在 STL容器的类定义中出现的儿种预约义的迭代器 typedef。不是每种 typedef 都出如今每一个容器中。 咱们使用常量版本的迭代器来访问只读容器或不该该被更改的非只读容器,使用反向迭 代器来以相反的方向访问容器。
为迭代器预先定义的typedef | ++的方向 | 读写能力 |
---|---|---|
iterator | 向前 | 读/写 |
const_iterator | 向前 | 读 |
reverse_iterator | 向后 | 读/写 |
const_reverse_iterator | 向后 | 读 |
下表显示了可做用在每种迭代器上的操做。 除了给出的对于全部迭代器都有的运算符,迭代器还必须提供默认构造函数、拷贝构造函数和拷贝赋值操做符。 前向迭代器支持++ 和全部的输入和输出迭 代器的功能。 双向迭代器支持–操做和前向迭代器的功能。 随机访问迭代器支持全部在表中给出的操做。 另外, 对于输入迭代器和输出迭代器,不能在保存迭代器以后再使用保存的值。
迭代器操做 | 描述 |
---|---|
适用全部迭代器的操做 | |
++p | 前置自增迭代器 |
p++ | 后置自增迭代器 |
p=p1 | 将一个迭代器赋值给另外一个迭代器 |
输入迭代器 | |
*p | 间接引用一个迭代器 |
p->m | 使用迭代器读取元素m |
p==p1 | 比较两个迭代器是否相等 |
p!=p1 | 比较两个迭代器是否不相等 |
输出迭代器 | |
*p | 间接引用一个迭代器 |
p=p1 | 把一个迭代器赋值给另外一个 |
前向迭代器 | 前向迭代器提供了输入和输出迭代器的全部功能 |
双向迭代器 | |
–p | q |
p– | 后置自减迭代器 |
随机访问迭代器 | |
p+=i | 迭代器p前进i个位置 |
p-=i | 迭代器p后退i个位置 |
p+i | 在迭代器p 的位置上前进i个位置 |
p-i | 在迭代器p的位置上后退i个位置 |
p-p1 | 表达式的值是一个整数,它表明同一个容器中两个元素间的距离 |
p[i] | 返回与迭代器p的位置相距i的元素 |
p<p1 | 若迭代器p小于p1(即容器中p在p1前)则返回 true, 不然返回 false |
p<=p1 | 若迭代器p小千或等于p1 (即容器中p 在p1前或位咒相同)则返回 true, 不然返回 false |
p>p1 | 若迭代器p 大于p1(即容器中p在p1后)则返回true, 不然返回false |
p>=p1 | 若迭代器p大于或等于p1(即容楛中p在p1后或位置相同)则返回 true, 不然返回 false |
STL提供了能够用于多种容器的算法,其中不少算法都是经常使用的。插入、删除、搜索、排序及其余一些对部分或所有序列容器和关联容器适用的算法。
STL包含了大约70个标准算法,表格中提供了这些算法的实例及概述。做用在容器元素上的算法只是间接地经过迭代器来实现。不少做用在序列元素上的算法经过一对迭代器定义:第一个迭代器指向这列元素的第一个,第二个迭代器指向最后一个元素以后的位置。 另外,还可使用类似的方法建立本身的算法,这样它们就能和STL容器及迭代器一块儿使用了。
C++标准库分为不少部分,每一个部分都有本身的头文件。头文件包含了造成标准库哥哥部分的相关函数的原型。头文件中还包含了各类各样的类类型和函数类型的定义,以及这些函数所需的常量。头文件能够“指示”编译器怎么处理标准库和用户编写的组件的接口问题。
C++标准库头 | 文件说明 |
---|---|
< iostream > | 包含C++标准输入和输出函数的原型。 |
< iomanip > | 包含格式化数据流的流操纵符的函数原型。 |
< cmath > | 包含数学库函数原型。 |
< cstdlib > | 包含数转换为文本、文本转换为数、内存分配、随机数及其余各类工具函数的函数原型。 |
< ctime > | 包含处理时间和日期的函数原型和类型。 |
< array >,< vector >,< list >,< forword_list >,< deque >,< queue >,< stack >,< map >,< unordered_map >,< unordered_set >,< set >,< bitset > | 这些头文件包含了实现C++标准库容器的类。 在程序执行期间 , 容器保存数据。 |
< ctype > | 包含测试字符特定属性(例如字符是不是数字字符或者标点符号)的函数原型和 用于将小写字母转换成大写字母 、 将大写字母转换成小写字母的函数原型。 |
< cstring > | 包含C风格字符串处理函数的函数原型。 |
< typeinfo > | 包含运行时类型识别(在执行时肯定数据类型)的类。 |
< exception >,< stdexcept > | 这两个头文件包含用于异常处理的类。 |
< memory > | 包含被C++标准库用来向C++标准库容器分配内存的类和函数。 |
< fstream > | 包含执行由磁盘文件输入和向磁盘文件输出的函数的函数原型。 |
< string > | 包含来自C++标准库的 string类的定义。 |
< sstream > | 包含执行由内存字符串输人和向内存字符串输出的函数的函数原型。 |
< functional > | 包含C++标准库算法所用的类和函数。 |
< iterator > | 包含访问C++标准库容器中数据的类。 |
< algorithm > | 包含操做C++标准库容器中数据的函数。 |
< cassert > | 包含为辅助程序调试而添加诊断的宏。 |
< cfloat > | 包含系统的浮点数长度限制。 |
< climits > | 包含系统的整数长度限制。 |
< cstdio > | 包含C风格标准输入和输出库函数的函数原型。 |
< locale > | 包含流处理一般所用的类和函数,用来处理不一样语言天然形式的数据(例如货币格式 、 排序字符串、字符表示 , 等等)。 |
< limits > | 包含为各计算机平台定义数字数据类型限制的类。 |
< utility > | 包含被许多C++标准库头文件所用的类和函数。 |