C++中std::algorithm库提供高效容器操作算法,定义于头文件,配合迭代器使用。1. 查找类函数:std::find查找首现元素,std::count统计指定值个数,std::find_if查找满足谓词的第一个元素。示例中在vector中找5的位置并计数,用lambda查找偶数。2. 排序与相关操作:std::sort升序排序,std::reverse反转元素,std::is_sorted判断是否有序,std::unique去重(需配合erase)。示例对数据排序、反转并去重。3. 修改型算法:std::copy复制元素,std::fill填充区间,std::replace替换值,std::transform应用操作生成新结果。示例填充7、平方转换。4. 比较与逻辑操作:std::equal判断两区间相等,std::lexicographical_compare字典序比较,std::search查找子序列。示例验证两向量相等并定位子序列。多数算法不改变容器大小,删除需结合erase。掌握这些可提升代码效率与可读性。

在C++中,std::algorithm 库提供了大量用于操作容器的通用算法。这些函数定义在 red">
1. 查找类函数
用于在范围内查找特定元素或满足条件的元素。
- std::find(begin, end, value):在区间 [begin, end) 中查找第一个等于 value 的元素,返回其迭代器,未找到则返回 end。
- std::count(begin, end, value):统计区间中等于 value 的元素个数。
- std::find_if(begin, end, pred):查找第一个满足谓词 pred 的元素。
// 示例:查找和计数
#include#include #include std::vector
nums = {1, 3, 5, 7, 5, 9}; 立即学习“C++免费学习笔记(深入)”;
auto it = std::find(nums.begin(), nums.end(), 5); if (it != nums.end()) { std::cout << "找到元素,位置:" << it - nums.begin() << "\n"; }
int cnt = std::count(nums.begin(), nums.end(), 5); std::cout << "数字5出现次数:" << cnt << "\n";
auto even = std::find_if(nums.begin(), nums.end(), [](int x) { return x % 2 == 0; }); if (even == nums.end()) { std::cout << "没有偶数\n"; }
2. 排序与相关操作
对容器中的元素进行排序或判断有序性。
- std::sort(begin, end):对区间内元素升序排序(可自定义比较函数)。
- std::reverse(begin, end):反转区间中的元素顺序。
- std::is_sorted(begin, end):判断是否已排序。
- std::unique(begin, end):移除相邻重复元素(通常配合 erase 使用)。
// 示例:排序与去重
std::vectordata = {5, 2, 8, 2, 1, 5, 9}; std::sort(data.begin(), data.end()); // 结果:{1,2,2,5,5,8,9}
std::reverse(data.begin(), data.end()); // 结果:{9,8,5,5,2,2,1}
// 去重 auto last = std::unique(data.begin(), data.end()); data.erase(last, data.end()); // 结果:{9,8,5,2,1}
3. 修改型算法
用于复制、替换、填充等操作。
- std::copy(src_begin, src_end, dest_begin):复制元素到另一区间。
- std::fill(begin, end, value):将区间所有元素设为 value。
- std::replace(begin, end, old_val, new_val):替换指定值。
- std::transform(begin, end, result, op):对每个元素应用操作并存储结果。
// 示例:填充与转换
std::vectorvec(5); std::fill(vec.begin(), vec.end(), 7); // 全部设为7 std::vector
src = {1, 2, 3, 4}; std::vector dst(4); std::transform(src.begin(), src.end(), dst.begin(), [](int x) { return x * x; }); // dst 变为 {1,4,9,16}
4. 比较与逻辑操作
判断两个序列是否相等,或是否存在某种关系。
- std::equal(a_begin, a_end, b_begin):判断两个区间内容是否相等。
- std::lexicographical_compare(a1, a2, b1, b2):字典序比较。
- std::search(sub_begin, sub_end, target_begin, target_end):查找子序列。
// 示例:比较与搜索
std::vectora = {1,2,3}, b = {1,2,3}; if (std::equal(a.begin(), a.end(), b.begin())) { std::cout << "a 和 b 相等\n"; } std::vector
text = {1,2,3,4,5}; std::vector pattern = {3,4}; auto pos = std::search(text.begin(), text.end(), pattern.begin(), pattern.end()); if (pos != text.end()) { std::cout << "子序列在位置 " << pos - text.begin() << "\n"; }
基本上就这些常用函数。掌握它们可以大幅提升代码效率和可读性。注意:大多数算法不改变容器大小,如需删除元素,常需配合容器自身的 erase 方法。







