标准模板库(STL)介绍

STL的六大组件:容器、算法、迭代器、适配器、仿函数、空间配置

容器:存放数据
算法:操作数据
迭代器:算法通过迭代器操作容器
适配器:为算法提供更多的接口
仿函数:为算法提供策略
空间配置器:为算法、容器提供动态空间

算法分类:质变算法、非质变算法
质变算法:会更改容器的值(拷贝、替换、删除等)
非质变算法:运算过程中不会更改区间内的元素

容器通过空间配置器取得数据存储空间,算法通过迭代器进行存取,仿函数可以协助算法完成不同的策略变化,适配器可以修饰或套接仿函数

STL容器

容器是用于存储数据的 STL 类,STL 提供了两种类型的容器类:
1. 顺序容器
2. 关联容器

顺序容器

顺序容器是 STL 中的一类容器,它们按照元素的添加顺序来存储和访问数据。

常见的几种顺序容器:
1. vector(向量):动态数组,支持高效的随机访问,可以在末尾快速添加和删除元素。
2. list(链表):双向链表,支持高效的插入和删除操作,但对于随机访问的效率较低。
3. deque(双端队列):双向开口的队列,支持在两端高效地添加和删除元素,也可以进行随机访问。
4. array(数组):固定大小的数组,大小在编译时确定,无法改变。

这些顺序容器都提供了不同的特性和适用场景。例如,如果需要高效的随机访问和在末尾进行频繁的添加和删除操作,可以选择 vector。如果需要频繁地在容器中间插入或删除元素,可以选择 list。如果需要在两端进行高效的添加和删除操作,可以选择 deque。如果需要固定大小的数组,可以选择 array。

关联容器

关联容器是 STL 中的另一类容器,它们基于键-值对(key-value)的存储结构,根据键进行元素的快速查找和访问。

常见的几种有序关联容器:

  1. set(集合):有序集合,其中的元素按照键值自动排序,且不允许重复元素。可以使用红黑树实现。
  2. map(映射):有序映射,每个元素都包含一个键和一个值,元素按照键进行自动排序。不允许重复的键值存在。同样,可以使用红黑树实现。
  3. multiset(多重集合):有序集合,允许重复元素存在,即可包含相同的键值。
  4. multimap(多重映射):有序映射,允许重复的键值存在。

除了上述的有序关联容器,STL 还提供了一些无序关联容器,它们以哈希表为基础来实现快速的查找和插入操作。

常见的无序关联容器有:

  1. unordered_set(无序集合):无序集合,存储的元素没有特定顺序,且不允许重复元素。
  2. unordered_map(无序映射):无序映射,存储的元素没有特定顺序。
  3. unordered_multiset(无序多重集合):无序集合,允许重复元素存在。
  4. unordered_multimap(无序多重映射):无序映射,允许重复的键值存在。

STL迭代器

迭代器是 C++ 中用于遍历容器元素的一种机制,它提供了一种统一的访问容器中元素的方式。通过使用迭代器,我们可以循环遍历容器,访问和修改容器中的元素,而不需要关心容器的具体实现细节。

迭代器的种类:

  1. 输入迭代器(Input Iterator):只能读取容器中的元素,一次性向前移动。
  2. 输出迭代器(Output Iterator):只能写入容器中的元素,一次性向前移动。
  3. 前向迭代器(Forward Iterator):可以读取和写入容器中的元素,支持单向遍历。
  4. 双向迭代器(Bidirectional Iterator):具备前向迭代器的功能,同时支持反向遍历。
  5. 随机访问迭代器(Random Access Iterator):具备双向迭代器的功能,同时支持随机访问和跳跃式遍历。

迭代器的基本操作:

  1. 解引用操作( * ):通过迭代器解引用得到元素的引用或值。
  2. 自增操作( ++ ):将迭代器移动到下一个位置。
  3. 比较操作(==、!=、<、>、<=、>=):用于比较两个迭代器的位置。
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_boundstd::upper_bound:在已排序的容器中查找范围。

以上只是一些常见的 STL 算法示例,实际上 STL 提供了更多的算法,涵盖了各种常见的操作,如查找、替换、排序、合并等。使用这些算法可以提高代码的可读性、可维护性和重用性。使用时,需要包含 <algorithm> 头文件并根据具体需求选择合适的算法。

  • 16
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值