前几天谈论了许多关于数论和数据结构的东西,这些内容可能对初学者而言比较晦涩难懂(毕竟是属于初高等算法/数据结构的范畴了)。今天打算来讲一些简单的内容 - STL 标准模板库。
STL 标准模板库
C++ 标准模板库 (Standard Template Library, STL),是 C++ 语言非常重要的一个构成部分。它提供了一组通用的类和函数,用于实现一些数据结构和算法。STL 主要包含以下五个部分:
- 容器 (Containers):STL 提供了不同的容器来供开发者根据所需要维护数据来选择存储。
- 算法 (Algorithms):STL 提供了许多通用算法,用于排序、搜索、复制、修改等操作。
- 迭代器 (Iterators):STL 迭代器的作用是遍历容器元素的对象。
- 函数对象 (Function Objects):这是一种行为类似于函数的对象(由于不太常见,因此本篇文章将不会详细讲解 STL 中的函数对象)。
- 适配器 (Adapters):STL 的适配器用于修改容器、迭代器或函数对象的接口。为方便起见,容器适配器将会与容器部分一同讲解。
综上所述,本文将会主要围绕 容器、算法和迭代器这三者来展开叙述。本文只会阐述一些相对常见的模板/方法,部分生僻的内容还请各位自行上网搜索。
容器 Containers
STL 容器还可以被细分成三个类别,分别是 序列式容器 (Sequence Containers)、关联式容器 (Associative Containers) 和 无序关联式容器 (Unordered Associative Containers)。
序列式容器 (Sequence Containers) 与常见容器适配器。
vector
向量容器:向量容器可以被理解为我们常说的动态数组。与普通数组不同的是,动态数组的大小可以在运行过程中更改,并且用户可以任意地在此数组的末尾添加数据。它的优点是支持快速随机访问和在末尾插入删除元素。向量容器的基本使用方法如下:
#include <iostream>
#include <vector> // 引入头文件
using namespace std;
int main(){
// 创建一个整数类型,名为 vec 的向量容器,初始存放了数字1-5。
vector<int> vec = {
1, 2, 3, 4, 5};
vec.push_back(6); // 向容器末尾添加一个元素6。
vec.size(); // 获取容器的大小,即容器内元素的个数。
vec.resize(10); // 动态更改容器的大小,将容器的大小设置为10。
// 通过 for 循环对容器进行遍历:
for (int i=0; i<vec.size(); i++){
}
for (int i : vec) {
}
return 0;
}
queue
队列容器适配器:队列是一种基本的数据结构,其讲究 先进先出 (FIFO),即最先添加进适配器的元素会被第一个弹出,以此类推。在队列中,所有元素都会从队尾入队,并从对首出队。队列适配器的优点是支持随机访问队首和队尾元素。队列容器严格意义上并非序列式容器,而是一种容器适配器。队列容器适配器的基本使用方法如下:
#include <iostream>
#include <queue> // 引入头文件
using namespace std;
int main(){
// 创建一个存放整数类型,名为 que 的队列容器适配器,一开始默认为空。
queue<int> que;
que.push(10); // 向队尾添加一个新元素。
que.front(); // 获取队首元素,此时队首元素为数字10。
que.pop(); // 将队首元素出队,此时的队列容器为空。
que.size(); // 获取队列的长度,即对内元素的个数。
que.empty(); // 判断队列是否为空,为空返回真,否则返回假。
// 队列元素不支持直接遍历,只能从头一个一个弹出。
// 在弹出元素时需要保证队内不为空。
while (!que.empty()){
int t = que.front();
que.pop();
cout << t << endl;
}
return 0;
}
stack
栈容器适配器:栈也是一种基本的数据结构,栈实现的是 后进先出 (LIFO),即最后添加进该适配器的元素会最先弹出。在栈中,所有元素都会从栈顶入栈,并从栈顶出栈。栈容器严格意义上并非序列式容器,而是一种容器适配器。栈容器适配器的基本使用方法如下:
#include <iostream>
#include <stack> // 引入头文件
using namespace std;
int main(){
// 创建一个存放整数类型,名为 s 的栈容器适配器,一开始默认为空。
stack<int> s;
s.push(10); // 将元素压入栈顶。
s.top(); // 获取栈顶元素,此时的栈顶元素为数字10。
s.pop(); // 将栈顶元素出栈,此时栈内没有元素。
s.size(); // 获取栈内元素的个数。
s.empty(); // 判断栈是否为空,为空返回真,否则返回假。
// 与队列相同,栈内元素不支持直接遍历,只能从栈顶一个一个弹出。
// 在弹出元素时需要保证栈内不为空。
while (!s.empty()){
int t = s.top();
s.pop();
cout << t << endl;
}
return 0