STL库简介及常用函数总结

#如何高效记录并整理编程学习笔记?#

简介
STL 是 C++ 标准模板库(Standard Template Library)的简称。它是 C++ 标准库的一部分,提供了一系列的模板类和函数,用于实现通用的数据结构和算法。

STL 包含了多种常见的数据结构(如向量、链表、集合、映射等)和算法(如排序、搜索、合并等),这些都是高效的、可复用的,并且经过了严格的测试和优化。STL 的设计目标是提供通用的解决方案,使得开发者能够更快速、更方便地编写高效的代码。

STL 的主要组成部分包括以下几个方面:

容器(Containers):提供了多种数据结构,包括向量(vector)、链表(list)、双端队列(deque)、集合(set)、映射(map)等,用于存储和管理数据。
迭代器(Iterators):提供了一种统一的访问容器中元素的方式,使得算法能够在不同类型的容器上进行操作,而不需要关心容器的具体实现。
算法(Algorithms):提供了多种常见的算法,包括排序(sort)、查找(find)、计数(count)、复制(copy)等,用于对容器中的元素进行各种操作和处理。
常见函数
lower_bound

功能: 在有序范围内查找第一个不小于给定值的元素。
原理: 使用二分查找法在有序序列中找到第一个不小于给定值的元素。
时间复杂度: O(log n)
空间复杂度: O(1)
用法:
vector<int> v = {1, 2, 4, 4, 5, 6, 7};
auto it = lower_bound(v.begin(), v.end(), 4);
upper_bound

原理: 使用二分查找法在有序序列中找到第一个大于给定值的元素。
时间复杂度: O(log n)
空间复杂度: O(1)
功能: 在有序范围内查找第一个大于给定值的元素。
用法:
vector<int> v = {1, 2, 4, 4, 5, 6, 7};
auto it = upper_bound(v.begin(), v.end(), 4);
equal_range

原理: 结合 lower_bound 和 upper_bound 使用二分查找法返回一对迭代器,表示不小于(第一个迭代器)和大于(第二个迭代器)给定值的范围。
时间复杂度: O(log n)
空间复杂度: O(1)
功能: 同时返回 lower_bound 和 upper_bound 的结果。
用法:
vector<int> v = {1, 2, 4, 4, 5, 6, 7};
auto bounds = equal_range(v.begin(), v.end(), 4);
binary_search

原理: 使用二分查找检查有序序列中是否存在特定元素。
时间复杂度: O(log n)
空间复杂度: O(1)
功能: 检查某个元素是否存在于有序序列中。
用法:
vector<int> v = {1, 2, 4, 4, 5, 6, 7};
bool found = binary_search(v.begin(), v.end(), 4);
sort

原理: 通常使用快速排序,但也可能结合堆排序和插入排序(具体实现取决于库),为了保证最坏情况下的性能。
时间复杂度: O(n log n)
空间复杂度: O(log n),这是递归栈的空间复杂度。
功能: 对整个范围进行排序。
用法:
vector<int> v = {7, 6, 5, 4, 3, 2, 1};
sort(v.begin(), v.end());
stable_sort

原理: 通常使用归并排序,确保相等元素的顺序保持不变。
时间复杂度: O(n log n)
空间复杂度: O(n) 用于存储临时元素。
功能: 排序,但保持相等元素之间的原始顺序。
用法:
vector<int> v = {7, 6, 5, 4, 3, 2, 1};
stable_sort(v.begin(), v.end());
partial_sort

原理: 结合了堆排序和插入排序。首先把最小的元素转换为一个堆,然后进行排序。
时间复杂度: O(n log k),其中 k 是要排序的元素数。
空间复杂度: O(1)
功能: 对范围的一部分进行排序,使其成为整个范围中的最小(或最大)元素。
用法:
vector<int> v = {7, 6, 5, 4, 3, 2, 1};
partial_sort(v.begin(), v.begin() + 3, v.end());
nth_element

原理: 类似于快速排序中的分区操作,只是它仅确保第 n 个元素在其最终位置,而不完全排序所有元素。
时间复杂度: 平均情况下是 O(n),但最坏情况下是 O(n^2)。
空间复杂度: O(1)
功能: 重新排列元素,以使第 n 个位置的元素(从0开始)位于排序后其应有的确切位置。
用法:
vector<int> v = {7, 6, 5, 4, 3, 2, 1};
nth_element(v.begin(), v.begin() + 3, v.end());
merge

原理: 采用归并排序中的合并步骤。按顺序比较两个有序序列的元素,并按排序顺序将它们合并到新序列中。
时间复杂度: O(n + m),其中 n 和 m 是两个序列的长度。
空间复杂度: O(n + m) - 需要额外的空间来存储合并后的序列,如果使用 back_inserter。
功能: 合并两个有序序列。
用法:
vector<int> v1 = {1, 3, 5};
vector<int> v2 = {2, 4, 6};
vector<int> v3;
merge(v1.begin(), v1.end(), v2.begin(), v2.end(), back_inserter(v3));
inplace_merge

原理: 也是归并排序的一部分,但在原地进行,无需额外的存储空间。
时间复杂度: O(n log n),n 是两部分合并前总元素的数量。
空间复杂度: O(1),尽管实际中可能需要小量的栈空间。
功能: 在同一位置合并两个已排序的部分。
用法:
vector<int> v = {1, 4, 6, 2, 3, 5};
inplace_merge(v.begin(), v.begin() + 3, v.end());
find

功能: 在给定范围内查找第一个等于特定值的元素。
原理: 线性查找。
时间复杂度: O(n)
空间复杂度: O(1)
用法:
vector<int> v = {1, 2, 3, 4, 5};
auto it = find(v.begin(), v.end(), 3);
if (it != v.end()) {
    cout << "Found element: " << *it << endl;
} else {
    cout << "Element not found" << endl;
}
find_if

功能: 根据条件函数查找第一个符合条件的元素。
原理: 线性查找。
时间复杂度: O(n)
空间复杂度: O(1)
用法:
vector<int> v = {1, 2, 3, 4, 5};
auto it = find_if(v.begin(), v.end(), [](int x) { return x > 3; });
if (it != v.end()) {
    cout << "Found element: " << *it << endl;
} else {
    cout << "Element not found" << endl;
}
count

功能: 计算等于特定值的元素的数量。
原理: 线性查找。
时间复杂度: O(n)
空间复杂度: O(1)
用法:
vector<int> v = {1, 2, 2, 3, 3, 3};
int numTwos = count(v.begin(), v.end(), 2);
cout << "Number of twos: " << numTwos << endl;
count_if

功能: 根据条件函数计数符合条件的元素数量。
原理: 线性查找。
时间复杂度: O(n)
空间复杂度: O(1)
用法:
vector<int> v = {1, 2, 3, 4, 5};
int numEven = count_if(v.begin(), v.end(), [](int x) { return x % 2 == 0; });
cout << "Number of even elements: " << numEven << endl;
replace

功能: 替换所有等于某个值的元素为另一个值。
原理: 线性扫描和替换。
时间复杂度: O(n)
空间复杂度: O(1)
用法:
vector<int> v = {1, 2, 2, 3, 4, 4};
replace(v.begin(), v.end(), 2, 5);
// 现在 v 中的元素为 {1, 5, 5, 3, 4, 4}
replace_if

功能: 根据条件函数替换符合条件的元素。
原理: 线性扫描和替换。
时间复杂度: O(n)
空间复杂度: O(1)
用法:
vector<int> v = {1, 2, 3, 4, 5};
replace_if(v.begin(), v.end(), [](int x) { return x > 3; }, 0);
// 现在 v 中的元素为 {1, 2, 3, 4, 0}
all_of

功能: 检查是否所有元素都满足某个条件。
原理: 线性扫描。
时间复杂度: O(n)
空间复杂度: O(1)
用法:
vector<int> v = {2, 4, 6, 8, 10};
bool allEven = all_of(v.begin(), v.end(), [](int x) { return x % 2 == 0; });
any_of

功能: 检查是否至少有一个元素满足某个条件。
原理: 线性扫描。
时间复杂度: O(n)
空间复杂度: O(1)
用法:
ector<int> v = {1, 2, 3, 4, 5};
bool anyEven = any_of(v.begin(), v.end(), [](int x) { return x % 2 == 0; });
none_of

功能: 检查是否没有元素满足某个条件。
原理: 线性扫描。
时间复杂度: O(n)
空间复杂度: O(1)
用法:
vector<int> v = {1, 3, 5, 7, 9};
bool noneEven = none_of(v.begin(), v.end(), [](int x) { return x % 2 == 0; });
copy

功能: 复制一个序列到另一个位置。
原理: 线性复制。
时间复杂度: O(n)
空间复杂度: O(1)(不包括输出序列空间)
用法:
vector<int> source = {1, 2, 3, 4, 5};
vector<int> dest(source.size());
copy(source.begin(), source.end(), dest.begin());
copy_if

功能: 根据条件函数复制符合条件的元素。
原理: 线性复制。
时间复杂度: O(n)
空间复杂度: O(1)(不包括输出序列空间)
用法:
vector<int> source = {1, 2, 3, 4, 5};
vector<int> dest;
copy_if(source.begin(), source.end(), back_inserter(dest), [](int x) { return x % 2 == 0; });

点个关注不迷路!!!!

  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值