C++ 资源库
蒲公英 2023-11-23 C++
# C++ STL 教程
C++标准模板库(Standard Template Library, STL)是一套功能强大的C++模板类和函数的集合,它提供了一系列通用的、可复用的算法和数据结构。STL的设计基于泛型编程,这意味着使用模板可以编写出独立于任何特定类型的代码。STL分为多个组件,包括容器(Containers)、迭代器(Iterators)、算法(Algorithms)、函数对象(Function Objects)和适配器(Adapters)等。
使用STL的好处:
- 代码复用: STL提供了大量的通用数据结构和算法,可以减少重复编写代码的工作。
- 性能优化: STL中的算法和数据结构都经过了优化,以提供最佳的性能。
- 泛型编程: 使用模板,STL支持泛型编程,使得算法和数据结构可以适用于任何数据类型。
- 易于维护: STL的设计使得代码更加模块化,易于阅读和维护。
C++标准模板库的核心包括以下重要组件:
| 组件 | 描述 |
|---|---|
| 容器(Containers) | 容器是STL中最基本的组件之一,提供了各种数据结构,包括向量(vector)、链表(list)、队列(queue)、栈(stack)、集合(set)、映射(map)等。这些容器具有不同的特性和用途,可以根据实际需求选择合适的容器。 |
| 算法(Algorithms) | STL提供了大量的算法,用于对容器中的元素进行各种操作,包括排序、搜索、赋值、移动、变换等。这些算法在使用时不需要关心容器的具体类型,只需要指定要操作的范围即可。 |
| 迭代器(iterators) | 迭代器用于遍历容器中的元素,允许以统一的方式访问容器中的元素,而不用关心容器的内部细节。STL提供了多种类型的迭代器、双向迭代器、前向迭代器和输入输出迭代器等。 |
| 函数对象(Function Objects) | 函数对象是可以像函数一样调用的对象,可以用于算法中的各种操作。STL提供了多种函数对象,包括一元函数对象、二元函数对象、谓词等,可以满足不同的需求。 |
| 适配器(Adapters) | 适配器用于将一种容器或迭代器适配成另一种容器或迭代器,以满足特定需求。STL提供了多种适配器,包括栈适配器(stack adapter)、队列适配器(queue adapter)和优先队列适配器(priority queue adapter)等。 |
这些组件都带有丰富的预定义函数,帮助我们通过简单的方式处理复杂的任务。
# 容器
容器是用来存储数据的序列,它提供了不同的存储方式和访问模式。
STL中的容器可以分为三类:
- 序列容器: 存储元素的序列,允许双向遍历
std::vector: 动态数组,支持快速随机访问。std::deque: 双端队列,支持快速插入和删除std::list: 链表,支持快速插入和删除,但不支持随机访问。
- 关联容器: 存储键值对,每个元素都有一个键(key)和一个值(value),并且通过键来组织元素。
std::set: 集合,不允许重复元素。std::multiset: 多重集合,允许多个元素具有相同的键。std::map: 映射,每个键映射到一个值。std::multimap: 多重映射,允许多个键映射到相同的值。
- 无序容器(C++11引入): 哈希表,支持快速的查找、插入和删除。
std::unordered_set: 无序集合。std::unordered_multiset: 无序多重集合。std::unordered_map: 无序映射。std::unordered_multimap: 无序多重映射。
下面的程序演示了向量容器(一个C++标准的模板),它与数组十分相似,唯一不同的是,向量在需要扩展大小的时候,会自动处理它自己的存储需求。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
// 创建一个向量存储 int
vector<int> vec;
int i;
// 显示 vec 的原始大小
cout << "vector size = " << vec.size() << endl;
// 推入 5 个值到向量中
for (i = 0; i < 5; i++)
{
vec.push_back(i);
}
// 显示 vec 扩展后的大小
cout << "extended vector size = " << vec.size() << endl;
// 访问向量中的 5 个值
for (i = 0; i < 5; i++)
{
cout << "value of vec [" << i << "] = " << vec[i] << endl;
}
// 使用迭代器 iterator 访问值
vector<int>::iterator v = vec.begin();
while (v != vec.end())
{
cout << "value of v = " << *v << endl;
v++;
}
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
注意
push_back()成员函数在向量的末尾插入值,如果有必要会扩展向量的大小。size()函数显示向量的大小begin()函数返回一个指向向量开头的迭代器end()函数返回一个指向向量末尾的迭代器
STL是C++编程中不可或缺的一部分,它极大地扩展了C++的功能,使得程序员能够编写出更加高效、可读性更强的代码。掌握STL的使用对C++开发者非常重要。
# C++ 标准库
C++标准库包括一组头文件,这些头文件提供了各种功能和工具,涵盖了输入输出、容器、算法、多线程、正则表达式等。C++标准库可以分为两部分:
- 标准函数库: 这个库是由通用的、独立的、不属于任何类的函数组成的,函数库继承自C语言。
- 面向对象类库: 这个库是类及其相关函数的集合。
C++标准库包含了所有的C标准库,为了支持类型安全,做了一定的添加和修改。
# 输入输出
<iostream>: 标准输入输出流<fstream>: 文件输入输出流<sstream>: 字符串流<iomanip>: 输入输出流格式化
# 容器
<array>: 定长数组容器<vector>: 动态数组容器<deque>:<list>:<forward_list>:<stack>:<queue>:<priority_queue>:<set>:<unordered_set>:<map>:<unordered_map>:<bitset>: