前言
这里只是简单列出C++标准模板库(STL)
一、概述
标准模板库(STL)是C++标准库的核心组成部分,提供了一套通用、高效的模板类和函数。STL基于泛型编程思想,包含容器(Containers)、**算法(Algorithms)和迭代器(Iterators)**三大核心组件,以及函数对象(Functors)、适配器(Adapters)和分配器(Allocators)等辅助组件。
二、核心组件详解
2.1 容器(Containers)
2.1.1 序列式容器
| 容器 |
特性 |
典型操作 |
vector |
动态数组,随机访问快 |
push_back, emplace_back |
deque |
双端队列,头尾插入高效 |
push_front, pop_back |
list |
双向链表 |
splice, merge |
forward_list |
单向链表(C++11) |
insert_after |
array |
固定大小数组(C++11) |
fill, size |
1 2 3
| vector<int> v = {1,2,3}; v.push_back(4); sort(v.begin(), v.end());
|
2.1.2 关联式容器
| 容器 |
特性 |
底层实现 |
set |
唯一键集合,自动排序 |
红黑树 |
multiset |
允许重复键的集合 |
红黑树 |
map |
键值对映射 |
红黑树 |
multimap |
允许重复键的映射 |
红黑树 |
1 2
| map<string, int> m = {{"Alice", 25}, {"Bob", 30}}; m["Charlie"] = 28;
|
2.1.3 无序关联容器(C++11)
| 容器 |
特性 |
底层实现 |
unordered_set |
哈希集合 |
哈希表 |
unordered_map |
哈希映射 |
哈希表 |
unordered_multiset |
可重复哈希集合 |
哈希表 |
unordered_multimap |
可重复哈希映射 |
哈希表 |
1 2
| unordered_map<string, int> um = {{"apple", 5}, {"banana", 3}}; cout << um.at("apple");
|
2.2 迭代器(Iterators)
2.2.1 迭代器类别
| 类型 |
支持操作 |
对应容器示例 |
| 输入迭代器 |
只读,单遍扫描 |
istream_iterator |
| 输出迭代器 |
只写,单遍扫描 |
ostream_iterator |
| 前向迭代器 |
读写,多遍扫描 |
forward_list |
| 双向迭代器 |
可双向移动 |
list, set |
| 随机访问迭代器 |
支持算术运算 |
vector, deque |
1 2
| vector<int>::iterator it = v.begin(); advance(it, 2);
|
2.3 算法(Algorithms)
2.3.1 常用算法分类
| 分类 |
示例算法 |
说明 |
| 非修改序列 |
find, count, for_each |
不改变容器内容 |
| 修改序列 |
copy, replace, remove |
可能改变容器内容 |
| 排序相关 |
sort, partial_sort |
各种排序操作 |
| 数值运算 |
accumulate, inner_product |
数学计算 |
1 2 3
| vector<int> v = {5,3,1,4,2}; sort(v.begin(), v.end()); reverse(v.begin(), v.end());
|
2.4 函数对象(Functors)与Lambda(C++11)
1 2 3 4 5 6 7 8 9 10 11 12
| struct Compare { bool operator()(int a, int b) const { return a > b; } }; sort(v.begin(), v.end(), Compare());
sort(v.begin(), v.end(), [](int a, int b) { return a < b; });
|
三、实用组件
3.1 适配器(Adapters)
3.1.1 容器适配器
1 2 3
| stack<int> s; queue<double> q; priority_queue<int> pq;
|
3.1.2 迭代器适配器
1 2 3
| vector<int> v = {1,2,3}; reverse_iterator<vector<int>::iterator> rit(v.end()); cout << *rit;
|
3.2 智能指针(C++11/14)
1 2 3
| unique_ptr<int> up(new int(5)); shared_ptr<int> sp = make_shared<int>(10); weak_ptr<int> wp = sp;
|
3.3 元组(C++11)与可选值(C++17)
1 2 3 4 5 6 7
| tuple<string, int, double> t("Alice", 25, 3.8); auto [name, age, gpa] = t;
optional<int> findValue(...) { if (...) return 42; return nullopt; }
|
四、现代C++特性
4.1 移动语义优化(C++11)
1 2 3 4 5
| vector<string> createStrings() { vector<string> v; v.push_back("large string"); return v; }
|
4.2 并行算法(C++17)
1 2
| vector<int> bigData(1000000); sort(execution::par, bigData.begin(), bigData.end());
|
4.3 范围库(C++20)
1 2 3
| vector<int> v = {5,3,2,4,1}; auto even = v | views::filter([](int x){ return x%2==0; }); ranges::sort(v);
|
五、总结与最佳实践
5.1 STL优势
- 通用性:模板支持任意符合要求的类型
- 高效性:经过高度优化的实现
- 可扩展性:可与自定义组件无缝集成
5.2 使用建议
- 优先选择STL而非原始数组
- 根据场景选择合适的容器:
- 随机访问:
vector/array
- 频繁插入删除:
list/forward_list
- 快速查找:
set/map或无序容器
- 使用
emplace操作避免临时对象
- 注意迭代器失效问题
- 利用算法替代手写循环
- 现代C++中优先使用智能指针管理资源
版权声明: 此文章版权归曦曦所有,如有转载,请注明来自原作者