V信公众号: 程序员架构笔记
C++ 标准模板库(STL,Standard Template Library)是 C++ 标准库的一部分,提供了丰富的通用数据结构和算法。STL 的核心组件包括容器、迭代器和算法。以下是对这些组件的简要介绍:
1. 容器(Containers)
容器是用于存储数据的对象。STL 提供了多种容器,分为以下几类:
顺序容器(Sequence Containers)
-
vector
:动态数组,支持快速随机访问,尾部插入和删除效率高。 -
list
:双向链表,支持高效的插入和删除操作,但不支持随机访问。 -
deque
:双端队列,支持在头部和尾部高效插入和删除,支持随机访问。
关联容器(Associative Containers)
-
set
:有序集合,元素唯一,基于红黑树实现。 -
multiset
:允许重复元素的有序集合。 -
map
:键值对的有序映射,键唯一。 -
multimap
:允许重复键的有序映射。
无序关联容器(Unordered Associative Containers)
-
unordered_set
:基于哈希表的无序集合,元素唯一。 -
unordered_multiset
:允许重复元素的无序集合。 -
unordered_map
:基于哈希表的无序键值对映射。 -
unordered_multimap
:允许重复键的无序映射。
容器适配器(Container Adaptors)
-
stack
:后进先出(LIFO)的栈。 -
queue
:先进先出(FIFO)的队列。 -
priority_queue
:优先队列,元素按优先级排序。
2. 迭代器(Iterators)
迭代器是用于遍历容器中元素的对象,类似于指针。它提供了统一的访问容器元素的方式。迭代器分为以下几类:
-
输入迭代器(Input Iterator):只能读取元素,单向移动。
-
输出迭代器(Output Iterator):只能写入元素,单向移动。
-
前向迭代器(Forward Iterator):支持读写,单向移动。
-
双向迭代器(Bidirectional Iterator):支持双向移动(如
list
的迭代器)。 -
随机访问迭代器(Random Access Iterator):支持随机访问(如
vector
的迭代器)。
示例:
std::vector<int> vec = {1, 2, 3, 4, 5}; for (auto it = vec.begin(); it != vec.end(); ++it) { std::cout << *it << " "; // 输出:1 2 3 4 5 }
3. 算法(Algorithms)
STL 提供了大量通用算法,用于对容器中的元素进行操作。这些算法通过迭代器与容器解耦,适用于多种容器。
常用算法:
-
排序算法:
-
sort
:对范围内的元素进行排序。
std::vector<int> vec = {5, 3, 1, 4, 2}; std::sort(vec.begin(), vec.end()); // 排序后:1 2 3 4 5
-
-
查找算法:
-
find
:在范围内查找指定值。
auto it = std::find(vec.begin(), vec.end(), 3); if (it != vec.end()) { std::cout << "Found: " << *it << std::endl; }
-
-
复制算法:
-
copy
:将范围内的元素复制到目标位置。
std::vector<int> dest(5); std::copy(vec.begin(), vec.end(), dest.begin());
-
-
其他常用算法:
-
reverse
:反转范围内的元素。 -
accumulate
:计算范围内元素的累加和。 -
count
:统计范围内某个值的出现次数。 -
max_element
/min_element
:查找范围内的最大值或最小值。
-
示例:
#include <algorithm> #include <iostream> #include <vector> int main() { std::vector<int> vec = {5, 3, 1, 4, 2}; std::sort(vec.begin(), vec.end()); // 排序 for (int x : vec) { std::cout << x << " "; // 输出:1 2 3 4 5 } return 0; }
4. STL 的优势
-
泛型编程:STL 基于模板实现,可以处理任意类型的数据。
-
高效性:STL 的容器和算法经过高度优化,性能优异。
-
可扩展性:用户可以通过自定义迭代器和算法扩展 STL 的功能。
5. 示例代码
以下是一个综合示例,展示如何使用容器、迭代器和算法:
#include <iostream> #include <vector> #include <algorithm> int main() { // 创建一个 vector 并初始化 std::vector<int> vec = {5, 3, 1, 4, 2}; // 使用 sort 算法排序 std::sort(vec.begin(), vec.end()); // 使用迭代器遍历并输出 std::cout << "Sorted vector: "; for (auto it = vec.begin(); it != vec.end(); ++it) { std::cout << *it << " "; } std::cout << std::endl; // 使用 find 算法查找元素 auto it = std::find(vec.begin(), vec.end(), 3); if (it != vec.end()) { std::cout << "Element 3 found at position: " << (it - vec.begin()) << std::endl; } return 0; }