在 C++ 中,标准模板库 (STL) 提供了一套编程工具,用于实现算法和数据结构,如向量、列表、队列等。
STL 使用已经经过严格测试的通用类和函数来实现这些数据结构和算法。
C++ STL 主要有 3 个组件
- 容器(Containers)
- 迭代器(Iterators)
- 算法
除了这些之外,STL 还提供了许多其他功能,包括函数对象、智能指针和异常处理机制。
C++ STL 容器
STL 容器按照需要以特定方式存储和组织数据。
例如,**向量**以顺序存储相同类型的数据。而**映射**则以键值对的形式存储数据。
我们可以将 STL 容器分为 3 类
1. 序列容器(Sequence containers):
2. 关联容器(Associative containers):
- 集合
- Multiset
- Map
- Multimap
3. 无序关联容器(Unordered associative containers):
- Unordered_set
- Unordered_multiset
- Unordered_map
- Unordered_multimap
要了解更多关于容器的信息,请访问我们的 C++ STL 容器教程。
注意: STL array 与我们之前使用的普通数组不同。STL array 定义在 std::array
类中,该类除了数组数据结构外,还包含许多有用的函数和算法。这些功能在普通数组中是不存在的。
示例 1:C++ STL 容器:Vector
在 C++ 中,向量类似于可调整大小的数组;它们以序列形式存储相同类型的数据,并且可以在运行时根据需要更改大小。
我们需要导入 <vector>
头文件才能使用向量。
#include <iostream>
#include <vector>
using namespace std;
int main() {
// create vector of int type
vector<int> numbers {1, 2, 3, 4, 5};
// print vector elements using ranged loop
for (int number : numbers) {
cout << number << " ";
}
return 0;
}
输出
1 2 3 4 5
在这里,我们创建了一个名为 numbers 的 int
类型向量,其中包含 5 个元素。
然后,我们使用 基于范围的 for 循环 打印了向量的所有元素。
要了解更多关于 C++ 向量的信息,请访问我们的 C++ 向量教程。
C++ STL 迭代器
迭代器是用于访问容器元素的对象的。
我们可以为 C++ 标准模板库中的每个容器声明一个迭代器。例如,
vector<int>::iterator it;
我们经常使用迭代器成员函数,如 begin()
、end()
等,来返回指向容器元素的迭代器。例如,
vector<int> numbers = {3, 2, 5, 1, 4};
vector<int>::iterator itr1 = numbers.begin();
vector<int>::iterator itr2 = numbers.end();
这里,
numbers.begin()
- 返回一个指向 numbers 向量开头的迭代器,即元素 **3**numbers.end()
- 返回一个指向 numbers 向量末尾的迭代器。
注意: numbers.end()
返回的不是指向最后一个元素 **4** 的迭代器。相反,它返回一个指向最后一个元素之后的理论元素的迭代器。其他所有容器类型也是如此。
要了解更多关于 STL 迭代器的信息,请访问我们的 _C++ STL 迭代器_ 教程。
示例 2:C++ STL 迭代器
#include <iostream>
#include <vector>
using namespace std;
int main() {
// initialize vector of int type
vector<int> numbers {1, 2, 3, 4, 5};
// initialize vector iterator to point to the first element
vector<int>::iterator itr = numbers.begin();
cout << "First Element: " << *itr << " "<<endl;
// change iterator to point to the last element
itr = numbers.end() - 1;
cout << "Last Element: " << *itr;
return 0;
}
输出
First Element: 1 Last Element: 5
在这里,我们使用了 numbers.end()- 1
而不是 numbers.end()
。
这是因为 end()
函数指向容器最后一个元素之后的理论元素。
因此,我们需要从 numbers.end()
中减去 **1** 才能指向最后一个元素。同样,使用代码 numbers.end()- 2
可以指向倒数第二个元素,依此类推。
注意: itr 前面的星号 *
表示正在访问迭代器所指向的元素的值。这类似于解引用指针。
此外,当我们尝试打印迭代器时,会收到一个错误。
// error
cout << itr << " ";
这是因为,与指针不同,我们无法打印迭代器。
C++ STL 算法
算法是一系列用于解决特定问题的指令。
在 C++ 中,我们可以使用标准模板库来实现一些常用的算法。这些 STL 组件通常被称为“算法库”。
C++ 标准模板库中最常用的算法包括
- 排序算法
- 搜索算法
- 复制算法
- 计数算法
要了解更多关于算法库的信息,请访问我们的 _C++ STL 算法_ 教程。
示例 3:C++ STL 排序算法
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
// initialize vector of int type
vector<int> numbers = {3, 2, 5, 1, 4};
// sort vector elements in ascending order
sort(numbers.begin(), numbers.end());
// print the sorted vector
for (int number : numbers) {
cout << number << " ";
}
return 0;
}
输出
1 2 3 4 5
在此示例中,我们使用了 sort()
函数将 numbers
向量的元素按升序排序。
请注意,我们导入了 <algorithm>
头文件来使用 sort()
函数。