C++的STL(Standard Template Library,即标准模板库)是C++最重要的组成部分之一,它为开发者提供了一组高效的算法和数据结构,极大地简化了代码的开发。STL主要由三大部分构成:算法、容器和迭代器。以下,我们将详细介绍STL的各个模块,帮助大家更深入理解和应用它们。
1. 算法模块
STL中的算法模块包含一组常用的算法函数,通常以函数模板的形式定义,这些函数通过参数化来适应不同的数据类型。
1.1 查找算法
在STL中,find是一个常用的查找算法,可以在容器中寻找特定的元素。
#include <algorithm>iterator find(iterator start, iterator end, const TYPE& val);
- 功能:在 [start, end)区间内查找val。
- 参数: - start:查找的起始位置(迭代器)。
- end:查找的终止位置(迭代器,指向最后一个元素的下一个位置)。
- val:查找的值。
 
- 返回值: - 找到时返回该元素的迭代器。
- 否则返回 end,表示查找失败。
 
1.2 排序算法
sort 是STL中用于排序的算法。默认情况下,它对元素进行升序排序。
void sort(iterator start, iterator end);
void sort(iterator start, iterator end, StrictWeakOrdering cmp);
- 功能:对 [start, end)区间内的元素进行排序。
- 参数: - start:排序起始位置(迭代器)。
- end:排序终止位置(迭代器)。
- cmp:用于定义自定义排序规则的回调函数。
 
例如,若希望将数据按降序排列,可以定义一个比较函数:
bool cmp(const int& a, const int& b) {return a > b;  // 降序排列
}
然后调用 sort:
sort(v.begin(), v.end(), cmp);
2. 容器模块
容器是STL的核心之一,它们提供了存储和管理数据的结构化方式。常用容器包括vector、list、deque、set、map等。下面重点介绍 vector。
2.1 vector 向量容器
 
vector 是一种动态数组,可以在末尾添加或删除元素,并且支持通过下标随机访问。vector 底层是一个顺序结构,允许扩展大小。
构造函数
vector 支持多种构造方式:
#include <vector>// 1. 指定长度并初始化每个元素
vector( size_type num, const TYPE& val = TYPE() );// 2. 通过一组数据初始化
vector( input_iterator start, input_iterator end );
- 参数: - num:容器的初始大小。
- val:初始化的默认值。
- start和- end:表示数据的起始和结束迭代器。
 
常用运算符
- == != <= >= < >:用于对 vector进行整体比较。
- []:通过下标访问元素,不会检查下标越界。越界访问会导致未定义行为。
常用成员函数
以下是 vector 的一些常用成员函数:
-  赋值函数 void assign(size_type num, const TYPE& val); void assign(input_iterator start, input_iterator end);该函数可以让 vector重新赋值,并自动调整大小。
-  访问元素 TYPE& at(size_type loc); const TYPE& at(size_type loc) const;- at函数用于安全访问元素,当- loc越界时会抛出异常。
 
-  头尾元素 - back():返回最后一个元素。
- front():返回第一个元素。
 
-  迭代器相关 iterator begin(); iterator end();- begin返回指向第一个元素的迭代器。
- end返回指向最后一个元素的下一个位置的迭代器。
 使用方法如下: for (auto it = v.begin(); it != v.end(); ++it) {cout << *it << endl; }
-  容量相关 - capacity():返回- vector的当前容量。
- size():返回- vector中的元素个数。
 
-  修改元素数量 - resize(size_type num, const TYPE& val = TYPE()):调整- vector的元素数量。
- reserve(size_type size):设置- vector的容量。
 
-  插入与删除 iterator insert(iterator loc, const TYPE& val); iterator erase(iterator loc);insert和erase函数可以在指定位置插入或删除元素。
-  反向迭代器 - rbegin():指向最后一个元素的逆向迭代器。
- rend():指向第一个元素前的逆向迭代器。
 
3. 迭代器模块
迭代器是访问容器中元素的工具,类似于指针。通过迭代器可以遍历容器中的元素。STL中的迭代器分为输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器。
3.1 常见的迭代器类型
- 输入迭代器:只用于读取容器中的元素。
- 输出迭代器:用于向容器写入数据。
- 前向迭代器:支持读取和写入数据。
- 双向迭代器:支持前后移动(如 list)。
- 随机访问迭代器:支持随机访问(如 vector、deque)。
例如,vector 的 begin() 和 end() 返回的是随机访问迭代器,因此可以直接通过 it + n 的方式来移动迭代器。
4. 常见用例示例
示例:在vector 中查找并排序元素
 
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int main() {vector<int> vec = {3, 1, 4, 1, 5, 9};// 查找元素auto it = find(vec.begin(), vec.end(), 4);if (it != vec.end()) {cout << "找到元素 4 的位置: " << distance(vec.begin(), it) << endl;} else {cout << "未找到元素 4" << endl;}// 对 vector 进行升序排序sort(vec.begin(), vec.end());cout << "排序后的 vector: ";for (int num : vec) {cout << num << " ";}cout << endl;return 0;
}
输出
找到元素 4 的位置: 2
排序后的 vector: 1 1 3 4 5 9
总结
STL 提供了丰富的数据结构和算法,使得 C++ 代码编写更加简洁、高效。通过合理使用 STL 中的算法、容器和迭代器,可以有效地提高代码的性能与可读性。理解并掌握 STL 是成为一名合格 C++ 开发者的关键。