前言

这里只是简单列出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); // O(1)摊销
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; // O(log n)

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"); // O(1)平均

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());

// Lambda表达式
sort(v.begin(), v.end(), [](int a, int b) {
return a < b; // 升序
});

三、实用组件

3.1 适配器(Adapters)

3.1.1 容器适配器

1
2
3
stack<int> s;       // 默认基于deque
queue<double> q; // 默认基于deque
priority_queue<int> pq; // 默认基于vector

3.1.2 迭代器适配器

1
2
3
vector<int> v = {1,2,3};
reverse_iterator<vector<int>::iterator> rit(v.end());
cout << *rit; // 输出3

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; // 结构化绑定(C++17)

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优势

  1. 通用性:模板支持任意符合要求的类型
  2. 高效性:经过高度优化的实现
  3. 可扩展性:可与自定义组件无缝集成

5.2 使用建议

  1. 优先选择STL而非原始数组
  2. 根据场景选择合适的容器:
    • 随机访问:vector/array
    • 频繁插入删除:list/forward_list
    • 快速查找:set/map或无序容器
  3. 使用emplace操作避免临时对象
  4. 注意迭代器失效问题
  5. 利用算法替代手写循环
  6. 现代C++中优先使用智能指针管理资源