STL的六个基本概念:容器(container)、迭代器(iterator)、算法(algorithm)、函数对象(function object)、适配器(adaptor) 和分配器(allocator).
容器
C++标准库提供四种序列容器和四种关联容器,另外三种序列容器适配器。
序列容器
序列容器里的元素保持严格的线性排列,deque , list , vector 是常用的三种序列容器。
容器里有大量的插入及删除操作的情况下优先使用list;在容器头尾有大量插入及删除的情况下优先使用deque容器,其他情况使用vector。
第四种序列容器是basic_string,用于表示字符串。
三个适配器类模板:queue、priority_queue 和 stack 都是类适配器(适配类型)。(另一种适配器为 实例适配器:适配类型的实例)。
任何序列容器类型,只要是CopyConstructible(可复制构造语义,类型T的实例能从类型T的另一个实例复制构造而来,则T是可复制构造的。)
关联容器
关联容器提供基于键的元素查找能力。STL中:map, multimap, set和 multiset. map 和multimap 提供了一种键类型与另一种值类型的关联。
标准库的容器中,只有vector保证其元素的存储空间是连续的,因而,它和C API兼容, 即可以通过 &vector[0] 获取其指向连续数据的指针(数组指针)。
对于std::string (或 std::wstring) 在已知的标准库字符串实现中,无一不采用连续的存储空间,即便如此,其仍不保证其存储空间是连续的,不能使用上述用法。
s所有的标准容器都提供里额swap()方法,可以在常数时间内,通过交换一些成员变量的值,交换同类型容器的内部状态,且该方法保证不抛出异常。(??)
迭代器
迭代器类别 | 说明 |
输入 | 从容器中读取元素。输入迭代器只能一次读入一个元素向前移动,输入迭代器只支持一遍算法,同一个输入迭代器不能两遍遍历一个序列 |
输出 | 向容器中写入元素。输出迭代器只能一次一个元素向前移动。输出迭代器只支持一遍算法,统一输出迭代器不能两次遍历一个序列 |
正向 | 组合输入迭代器和输出迭代器的功能,并保留在容器中的位置 |
双向 | 组合正向迭代器和逆向迭代器的功能,支持多遍算法 |
随机访问 | 组合双向迭代器的功能与直接访问容器中任何元素的功能,即可向前向后跳过任意个元素 |
迭代器操作 | 说明 |
所有迭代器 | |
p++ | 后置自增迭代器 |
++p | 前置自增迭代器 |
输入迭代器 | |
*p | 复引用迭代器,作为右值 |
p=p1 | 将一个迭代器赋给另一个迭代器 |
p==p1 | 比较迭代器的相等性 |
p!=p1 | 比较迭代器的不等性 |
输出迭代器 | |
*p | 复引用迭代器,作为左值 |
p=p1 | 将一个迭代器赋给另一个迭代器 |
正向迭代器 | 提供输入输出迭代器的所有功能 |
双向迭代器 | |
--p | 前置自减迭代器 |
p-- | 后置自减迭代器 |
随机迭代器 | |
p+=i | 将迭代器递增i位 |
p-=i | 将迭代器递减i位 |
p+i | 在p位加i位后的迭代器 |
p-i | 在p位减i位后的迭代器 |
p[i] | 返回p位元素偏离i位的元素引用 |
p<p1 | 如果迭代器p的位置在p1前,返回true,否则返回false |
p<=p1 | p的位置在p1的前面或同一位置时返回true,否则返回false |
p>p1 | 如果迭代器p的位置在p1后,返回true,否则返回false |
p>=p1 | p的位置在p1的后面或同一位置时返回true,否则返回false |
只有顺序容器和关联容器支持迭代器遍历,各容器支持的迭代器的类别如下:
容器 | 支持的迭代器类别 |
vector | 随机访问 |
deque | 随机访问 |
list | 双向 |
set | 双向 |
multiset | 双向 |
map | 双向 |
multimap | 双向 |
stack | 不支持 |
queue | 不支持 |
priority_queue | 不支持 |