C++ STL标准模板库详解:深入探索算法、容器与迭代器
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++ 开发者的关键。