STL的六大组件:容器、算法、迭代器、适配器、仿函数、空间配置
容器:存放数据
算法:操作数据
迭代器:算法通过迭代器操作容器
适配器:为算法提供更多的接口
仿函数:为算法提供策略
空间配置器:为算法、容器提供动态空间
算法分类:质变算法、非质变算法
质变算法:会更改容器的值(拷贝、替换、删除等)
非质变算法:运算过程中不会更改区间内的元素
容器通过空间配置器取得数据存储空间,算法通过迭代器进行存取,仿函数可以协助算法完成不同的策略变化,适配器可以修饰或套接仿函数
STL容器
容器是用于存储数据的 STL 类,STL 提供了两种类型的容器类:
1. 顺序容器
2. 关联容器
顺序容器
顺序容器是 STL 中的一类容器,它们按照元素的添加顺序来存储和访问数据。
常见的几种顺序容器:
1. vector(向量):动态数组,支持高效的随机访问,可以在末尾快速添加和删除元素。
2. list(链表):双向链表,支持高效的插入和删除操作,但对于随机访问的效率较低。
3. deque(双端队列):双向开口的队列,支持在两端高效地添加和删除元素,也可以进行随机访问。
4. array(数组):固定大小的数组,大小在编译时确定,无法改变。
这些顺序容器都提供了不同的特性和适用场景。例如,如果需要高效的随机访问和在末尾进行频繁的添加和删除操作,可以选择 vector。如果需要频繁地在容器中间插入或删除元素,可以选择 list。如果需要在两端进行高效的添加和删除操作,可以选择 deque。如果需要固定大小的数组,可以选择 array。
关联容器
关联容器是 STL 中的另一类容器,它们基于键-值对(key-value)的存储结构,根据键进行元素的快速查找和访问。
常见的几种有序关联容器:
- set(集合):有序集合,其中的元素按照键值自动排序,且不允许重复元素。可以使用红黑树实现。
- map(映射):有序映射,每个元素都包含一个键和一个值,元素按照键进行自动排序。不允许重复的键值存在。同样,可以使用红黑树实现。
- multiset(多重集合):有序集合,允许重复元素存在,即可包含相同的键值。
- multimap(多重映射):有序映射,允许重复的键值存在。
除了上述的有序关联容器,STL 还提供了一些无序关联容器,它们以哈希表为基础来实现快速的查找和插入操作。
常见的无序关联容器有:
- unordered_set(无序集合):无序集合,存储的元素没有特定顺序,且不允许重复元素。
- unordered_map(无序映射):无序映射,存储的元素没有特定顺序。
- unordered_multiset(无序多重集合):无序集合,允许重复元素存在。
- unordered_multimap(无序多重映射):无序映射,允许重复的键值存在。
STL迭代器
迭代器是 C++ 中用于遍历容器元素的一种机制,它提供了一种统一的访问容器中元素的方式。通过使用迭代器,我们可以循环遍历容器,访问和修改容器中的元素,而不需要关心容器的具体实现细节。
迭代器的种类:
- 输入迭代器(Input Iterator):只能读取容器中的元素,一次性向前移动。
- 输出迭代器(Output Iterator):只能写入容器中的元素,一次性向前移动。
- 前向迭代器(Forward Iterator):可以读取和写入容器中的元素,支持单向遍历。
- 双向迭代器(Bidirectional Iterator):具备前向迭代器的功能,同时支持反向遍历。
- 随机访问迭代器(Random Access Iterator):具备双向迭代器的功能,同时支持随机访问和跳跃式遍历。
迭代器的基本操作:
- 解引用操作
( * )
:通过迭代器解引用得到元素的引用或值。 - 自增操作
( ++ )
:将迭代器移动到下一个位置。 - 比较操作
(==、!=、<、>、<=、>=)
:用于比较两个迭代器的位置。
std::vector<int> vec = {1, 2, 3, 4, 5};
// 使用 auto 关键字推导迭代器类型
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " "; // 访问迭代器指向的元素
}
std::cout << std::endl;
// 使用 const_iterator 遍历不可修改的容器
for (std::vector<int>::const_iterator cit = vec.cbegin(); cit != vec.cend(); ++cit) {
std::cout << *cit << " ";
}
std::cout << std::endl;
STL算法
STL(标准模板库)提供了丰富的算法库,包含在
<algorithm>
头文件中。这些算法可用于处理各种容器,如向量(vector)、列表(list)、集合(set)、映射(map)等。
下面是一些常用的 STL 算法:
1. 遍历算法:
std::for_each
:对容器中的每个元素执行指定操作。std::find
:在容器中查找指定值的元素。std::find_if
:根据给定条件查找容器中符合条件的元素。std::count
:统计容器中满足指定值的元素数量。
2. 修改算法:
std::copy
:将一个容器中的元素复制到另一个容器中。std::transform
:对容器中的每个元素应用指定操作,并存储结果到另一个容器中。std::replace
:将容器中符合条件的元素替换为指定值。std::fill
:将容器的元素填充为指定值。
3. 排序和搜索算法:
std::sort
:对容器中的元素进行排序。std::binary_search
:在已排序的容器中执行二分搜索。std::lower_bound
和std::upper_bound
:在已排序的容器中查找范围。
以上只是一些常见的 STL 算法示例,实际上 STL 提供了更多的算法,涵盖了各种常见的操作,如查找、替换、排序、合并等。使用这些算法可以提高代码的可读性、可维护性和重用性。使用时,需要包含
<algorithm>
头文件并根据具体需求选择合适的算法。