STL 介绍
C++标准模板库(Standard Template Library,STL)是C++标准库的重要组成部分,提供了一系列模板化的通用数据结构和算法。
STL最初由Alexander Stepanov在20世纪90年代早期开发,后于1994年被纳入C++标准。它的设计理念基于泛型编程,强调代码复用和效率。
#include <iostream> #include <vector> #include <algorithm> int main() { // 创建vector容器 std::vector<int> nums = {5, 2, 8, 1, 9}; // 使用算法排序 std::sort(nums.begin(), nums.end()); // 使用迭代器遍历 for (auto it = nums.begin(); it != nums.end(); ++it) { std::cout << *it << " "; } return 0; }
STL的核心优势
- 泛型编程:通过模板实现与数据类型无关的通用算法
- 高性能:算法和数据结构经过高度优化
- 可复用性:标准化的接口设计
- 扩展性:用户可以自定义满足需求的组件
- 标准化:跨平台兼容性
六大部件总览
STL由六个主要组件构成,它们协同工作提供强大的功能:
容器(Containers)
用于存储数据的模板类,如vector、list、map等,分为序列容器和关联容器两大类。
迭代器(Iterators)
提供访问容器元素的方法,类似于指针,是算法与容器之间的桥梁。
算法(Algorithms)
执行各种操作的标准模板函数,如排序、搜索、变换等,通过迭代器操作容器。
仿函数(Functors)
重载了operator()的类对象,可以像函数一样被调用,用于自定义操作行为。
适配器(Adapters)
修改容器或仿函数接口的组件,如stack、queue、priority_queue等。
空间配置器(Allocators)
负责内存分配与管理的模板类,允许自定义内存分配策略。
组件协作关系
STL六大组件通过标准化的接口协同工作:
容器通过空间配置器获取存储空间;算法通过迭代器访问容器内容;仿函数可以协助算法完成不同的策略变化;适配器可以修饰或组合其他组件。
容器(Containers)
容器是存储其他对象的对象,管理对象的集合。STL容器分为序列容器和关联容器两大类。
序列容器
vector
动态数组,支持快速随机访问,尾部插入/删除高效
deque
双端队列,支持头尾高效插入/删除
list
双向链表,任意位置高效插入/删除
forward_list
单向链表,更节省空间
array
固定大小数组,更安全的传统数组替代
关联容器
set
有序唯一键集合,基于红黑树实现
map
有序键值对集合,键唯一
multiset
有序集合,允许重复键
multimap
有序键值对集合,允许重复键
无序关联容器(C++11)
unordered_set
哈希集合,无序但查找高效
unordered_map
哈希映射,键值对的无序集合
unordered_multiset
允许重复键的哈希集合
unordered_multimap
允许重复键的哈希映射
迭代器(Iterators)
迭代器提供了一种访问容器元素的方法,同时隐藏了容器的内部实现细节。它们类似于指针,可以遍历容器中的所有元素。
迭代器类别
输入迭代器
只读访问,单向移动
输出迭代器
只写访问,单向移动
前向迭代器
读写访问,单向移动
双向迭代器
读写访问,双向移动
随机访问迭代器
读写访问,任意位置跳转
迭代器操作
#include <iostream> #include <vector> int main() { std::vector<int> vec = {10, 20, 30, 40, 50}; // 获取迭代器 auto it = vec.begin(); // 迭代器基本操作 std::cout << "First element: " << *it << std::endl; // 10 it += 2; // 随机访问 std::cout << "Third element: " << *it << std::endl; // 30 // 使用迭代器遍历 for (auto it = vec.begin(); it != vec.end(); ++it) { std::cout << *it << " "; } return 0; }
算法(Algorithms)
STL提供了超过100种算法,用于执行排序、搜索、变换等操作。这些算法通过迭代器与容器交互,不依赖容器的具体实现。
常用算法分类
分类 | 算法示例 | 功能描述 |
---|---|---|
排序算法 | sort, stable_sort, partial_sort | 对序列进行排序 |
查找算法 | find, binary_search, lower_bound | 在序列中查找元素 |
数值算法 | accumulate, inner_product, iota | 数值计算操作 |
修改算法 | copy, transform, replace, fill | 修改序列内容 |
分区算法 | partition, stable_partition | 根据条件分区元素 |
堆算法 | make_heap, push_heap, pop_heap | 堆结构操作 |
集合算法 | set_union, set_intersection | 集合操作 |
排列算法 | next_permutation, prev_permutation | 生成排列 |
算法示例代码
#include <iostream> #include <vector> #include <algorithm> #include <numeric> int main() { std::vector<int> vec = {5, 3, 1, 4, 2}; // 排序 std::sort(vec.begin(), vec.end()); // 查找 auto it = std::find(vec.begin(), vec.end(), 4); if (it != vec.end()) { std::cout << "Found: " << *it << std::endl; } // 数值计算 int sum = std::accumulate(vec.begin(), vec.end(), 0); std::cout << "Sum: " << sum << std::endl; // 变换 std::vector<int> doubled(vec.size()); std::transform(vec.begin(), vec.end(), doubled.begin(), [](int x) { return x * 2; }); // 输出结果 for (int x : doubled) { std::cout << x << " "; } return 0; }