无标题
C++ 常用STL总结
在 LeetCode 中使用 C++ 刷题时,STL(Standard Template Library) 和相关函数能极大简化代码实现。以下是高频使用的 STL 组件和函数,按类别分类整理:
一、容器类(Containers)
-
序列容器
-
vector
- 动态数组,支持快速随机访问
- 常用操作:
push_back()
,pop_back()
,size()
,resize()
,emplace_back()
,back()
,clear()
- 场景:动态规划、数组操作、临时存储数据
-
string
- 字符串处理,类似
vector<char>
- 常用操作:
substr()
,find()
,append()
,push_back()
,size()
,empty()
- 场景:回文、子串、字符串匹配
- 字符串处理,类似
-
deque
- 双端队列,支持头尾高效插入删除
- 场景:滑动窗口最大值(单调队列优化)
-
-
容器适配器
-
queue
- 队列,FIFO,常用操作:
push()
,pop()
,front()
,empty()
- 场景:BFS(广度优先搜索)
- 队列,FIFO,常用操作:
-
stack
- 栈,LIFO,常用操作:
push()
,pop()
,top()
,empty()
- 场景:括号匹配、单调栈、DFS(非递归实现)
- 栈,LIFO,常用操作:
-
priority_queue
- 优先队列(默认最大堆),常用操作:
push()
,pop()
,top()
- 自定义排序:
priority_queue<int, vector<int>, greater<>>
(最小堆) - 场景:Top K 问题、合并K个有序链表
- 优先队列(默认最大堆),常用操作:
-
-
关联容器
-
unordered_set
/unordered_map
- 哈希表实现,查询/插入平均 O(1)
- 常用操作:
insert()
,find()
,count()
,erase()
,contains()
- 场景:快速查找元素是否存在(如两数之和)
-
set
/map
- 红黑树实现,元素有序,查询/插入 O(log n)
- 场景:维护有序数据(如区间合并)
-
multiset
/multimap
- 允许重复键,其他类似
set/map
- 场景:滑动窗口中位数(维护有序序列)
- 允许重复键,其他类似
-
二、算法(Algorithms)
-
排序与查找
-
sort(begin, end, cmp)
- 快速排序,默认升序,支持自定义比较函数
- 场景:数组排序、贪心算法预处理
-
binary_search(begin, end, val)
- 二分查找,需容器已排序
- 场景:有序数组查找
-
-
常用工具函数
-
reverse(begin, end)
- 反转区间元素
- 场景:旋转数组、字符串反转
-
swap(a, b)
- 交换两个变量的值
-
max(a, b)
/min(a, b)
- 返回两个值的最大/最小值
-
max_element(begin, end)
- 返回区间最大值的迭代器
-
accumulate(begin, end, init)
- 计算区间元素累加和
-
next_permutation(begin, end)
- 生成下一个排列
- 场景:全排列问题
-
三、其他关键工具
-
迭代器与范围遍历
begin()
,end()
- 获取容器的迭代器
auto
关键字- 简化迭代器声明:
for (auto& num : nums)
- 简化迭代器声明:
-
函数对象(Functors)
greater<>()
/less<>()
- 用于定义排序规则,如
sort(v.begin(), v.end(), greater<>())
- 用于定义排序规则,如
-
工具类
pair<T1, T2>
- 存储键值对,如
pair<int, int>
表示坐标或区间
- 存储键值对,如
tuple
- 多元素组合,较少使用但灵活
四、典型场景与对应 STL
- 动态规划:
vector
存储状态 - BFS:
queue
管理节点 - 哈希问题:
unordered_map
快速查询 - 字符串处理:
string
的substr
和find
- Top K 问题:
priority_queue
维护堆 - 区间问题:
map
或set
维护有序区间
C++ contains 函数
在 C++ 中,contains
函数的功能是检查容器或字符串中是否包含某个元素或子字符串。不过,它的具体实现和可用性取决于不同的容器类型和 C++ 标准版本。以下是详细说明:
一、字符串中的 contains
函数(C++23 起)
std::string::contains
是 C++23 标准新增的成员函数,用于检查字符串是否包含特定子字符串或字符。
语法:
1 | bool contains(const std::string& substr) const; // 检查子字符串 |
示例:
1 |
|
兼容性问题:
如果编译器不支持 C++23,可以用 find
替代:
1 | if (str.find("world") != std::string::npos) { |
二、关联容器中的 contains
函数(C++20 起)
C++20 标准为以下关联容器新增了 contains
成员函数,用于检查键是否存在:
std::set
std::map
std::unordered_set
std::unordered_map
语法:
1 | bool contains(const Key& key) const; |
示例:
1 |
|
输出:
1 | set 包含 2 |
兼容性问题:
在 C++20 之前,可以使用 find()
替代:
1 | if (s.find(2) != s.end()) { |
三、其他容器中的 contains
功能
对于非关联容器(如 vector
, list
等),标准库没有直接提供 contains
函数,但可以通过以下方式实现类似功能:
1. 使用 std::find
算法
1 |
|
2. 自定义 contains
模板函数
1 | template <typename Container, typename T> |