#include <algorithm> 是 C++ 标准库中的一个头文件,它提供了很多常见的算法,用于对容器(如 vector、list、deque)和数组等数据结构进行处理;这些算法不仅可以操作顺序容器(如数组和 vector),还可以操作关联容器(如 set 和 map)等
在使用 #include <algorithm> 时,常常会用到许多通用的操作,比如排序、查找、拷贝、合并、统计等;这些算法通常基于迭代器进行操作,因此可以广泛应用于不同的数据结构
#include <algorithm> 中的常见算法
1. 排序相关算法
-
std::sort(begin, end)
对指定范围[begin, end)内的元素进行升序排序;其实现一般使用快速排序(QuickSort)或其他高效排序算法,时间复杂度为O(n log n)示例:
std::vector<int> vec = {4, 1, 3, 2}; std::sort(vec.begin(), vec.end()); // 排序后的 vec 为 {1, 2, 3, 4} -
std::stable_sort(begin, end)
与std::sort相似,但它保证排序时保持相等元素的相对顺序不变,即稳定排序示例:
std::vector<int> vec = {4, 1, 3, 2}; std::stable_sort(vec.begin(), vec.end()); // 排序后的 vec 为 {1, 2, 3, 4}
2. 查找相关算法
-
std::find(begin, end, value)
在指定范围内查找第一个等于value的元素;如果找到了,返回指向该元素的迭代器,否则返回end示例:
std::vector<int> vec = {1, 2, 3, 4}; auto it = std::find(vec.begin(), vec.end(), 3); // it 指向 3 if (it != vec.end()) { std::cout << "Found!" << std::endl; } -
std::binary_search(begin, end, value)
在已排序的范围内进行二分查找,返回一个布尔值,表示是否找到元素value示例:
std::vector<int> vec = {1, 2, 3, 4, 5}; bool found = std::binary_search(vec.begin(), vec.end(), 3); // found 为 true
3. 修改相关算法
-
std::reverse(begin, end)
将指定范围内的元素进行反转示例:
std::vector<int> vec = {1, 2, 3, 4}; std::reverse(vec.begin(), vec.end()); // vec 变为 {4, 3, 2, 1} -
std::fill(begin, end, value)
将指定范围内的所有元素都填充为value示例:
std::vector<int> vec(5); std::fill(vec.begin(), vec.end(), 10); // vec 变为 {10, 10, 10, 10, 10} -
std::transform(begin, end, result, func)
对范围[begin, end)内的每个元素应用函数func,并将结果存储到result中示例:
std::vector<int> vec = {1, 2, 3, 4}; std::vector<int> result(vec.size()); std::transform(vec.begin(), vec.end(), result.begin(), [](int x) { return x * 2; }); // result 为 {2, 4, 6, 8}
4. 拷贝与合并算法
-
std::copy(begin, end, dest)
将指定范围[begin, end)的元素拷贝到目标容器dest中示例:
std::vector<int> src = {1, 2, 3}; std::vector<int> dest(3); std::copy(src.begin(), src.end(), dest.begin()); // dest 变为 {1, 2, 3} -
std::merge(begin1, end1, begin2, end2, dest)
将两个已排序的区间合并成一个新的已排序区间示例:
std::vector<int> vec1 = {1, 3, 5}; std::vector<int> vec2 = {2, 4, 6}; std::vector<int> result(6); std::merge(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), result.begin()); // result 为 {1, 2, 3, 4, 5, 6}
5. 集合操作算法
-
std::set_union(begin1, end1, begin2, end2, dest)
计算两个已排序区间的并集,存储到dest中示例:
std::vector<int> vec1 = {1, 2, 3}; std::vector<int> vec2 = {2, 3, 4}; std::vector<int> result(6); auto it = std::set_union(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), result.begin()); result.resize(it - result.begin()); // result 为 {1, 2, 3, 4} -
std::set_intersection(begin1, end1, begin2, end2, dest)
计算两个已排序区间的交集,存储到dest中示例:
std::vector<int> vec1 = {1, 2, 3, 4}; std::vector<int> vec2 = {3, 4, 5, 6}; std::vector<int> result(4); auto it = std::set_intersection(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), result.begin()); result.resize(it - result.begin()); // result 为 {3, 4}
6. 最小值与最大值相关算法
-
std::min(a, b)
返回a和b中较小的那个示例:
int a = 5, b = 10; int minimum = std::min(a, b); // minimum 为 5 -
std::max(a, b)
返回a和b中较大的那个示例:
int a = 5, b = 10; int maximum = std::max(a, b); // maximum 为 10 -
std::min_element(begin, end)
返回范围内最小元素的迭代器 -
std::max_element(begin, end)
返回范围内最大元素的迭代器
小结
#include <algorithm> 提供了一系列广泛使用的通用算法,能够有效地提高代码的简洁性和执行效率;通过这些算法,你可以轻松地进行排序、查找、修改、拷贝、合并等常见任务,从而简化手动实现这些操作的复杂性

1079

被折叠的 条评论
为什么被折叠?



