C++ algorithm算法库内容介绍

C++ 标准库中的 <algorithm> 提供了丰富的通用算法,主要用于操作容器(如 vector, list, array 等)。这些算法通常通过迭代器(如 begin(), end())访问数据,不直接操作容器本身。以下是主要分类及常用算法:


1. 非修改序列操作(不改变容器内容)

算法功能示例
std::all_of检查所有元素是否满足条件if (all_of(v.begin(), v.end(), [](int x){ return x > 0; }))
std::any_of检查是否有任意元素满足条件if (any_of(v.begin(), v.end(), [](int x){ return x < 0; }))
std::none_of检查是否没有元素满足条件if (none_of(v.begin(), v.end(), [](int x){ return x == 0; }))
std::for_each对每个元素执行操作for_each(v.begin(), v.end(), [](int& x){ x *= 2; });
std::count统计等于某值的元素个数int n = count(v.begin(), v.end(), 42);
std::count_if统计满足条件的元素个数int n = count_if(v.begin(), v.end(), [](int x){ return x % 2 == 0; });
std::find查找第一个等于某值的元素auto it = find(v.begin(), v.end(), 42);
std::find_if查找第一个满足条件的元素auto it = find_if(v.begin(), v.end(), [](int x){ return x > 100; });
std::find_if_not查找第一个不满足条件的元素auto it = find_if_not(v.begin(), v.end(), [](int x){ return x < 0; });
std::search在序列中查找子序列auto it = search(v1.begin(), v1.end(), v2.begin(), v2.end());

2. 修改序列操作(可能改变容器内容)

算法功能示例
std::copy复制元素到目标位置copy(src.begin(), src.end(), dest.begin());
std::copy_if复制满足条件的元素copy_if(v.begin(), v.end(), back_inserter(dest), [](int x){ return x > 0; });
std::move移动元素(C++11)move(src.begin(), src.end(), dest.begin());
std::fill填充元素为指定值fill(v.begin(), v.end(), 0);
std::generate用函数生成值填充generate(v.begin(), v.end(), rand);
std::replace替换等于某值的元素replace(v.begin(), v.end(), 0, 42);
std::replace_if替换满足条件的元素replace_if(v.begin(), v.end(), [](int x){ return x < 0; }, 0);
std::remove删除等于某值的元素(逻辑删除)auto it = remove(v.begin(), v.end(), 0);
std::remove_if删除满足条件的元素auto it = remove_if(v.begin(), v.end(), [](int x){ return x % 2 == 0; });
std::reverse反转序列reverse(v.begin(), v.end());
std::rotate循环移动元素rotate(v.begin(), v.begin() + 2, v.end());
std::shuffle随机打乱序列(C++11)shuffle(v.begin(), v.end(), std::default_random_engine());
std::unique去除相邻重复元素auto it = unique(v.begin(), v.end());

3. 排序与二分查找

算法功能示例
std::sort对序列排序(默认升序)sort(v.begin(), v.end());
std::stable_sort稳定排序(保持相等元素顺序)stable_sort(v.begin(), v.end());
std::partial_sort部分排序(前N个元素有序)partial_sort(v.begin(), v.begin() + 5, v.end());
std::nth_element使第n个元素处于正确位置nth_element(v.begin(), v.begin() + 3, v.end());
std::binary_search二分查找(返回是否找到)bool found = binary_search(v.begin(), v.end(), 42);
std::lower_bound返回第一个不小于某值的迭代器auto it = lower_bound(v.begin(), v.end(), 42);
std::upper_bound返回第一个大于某值的迭代器auto it = upper_bound(v.begin(), v.end(), 42);
std::equal_range返回等于某值的范围(pair)auto p = equal_range(v.begin(), v.end(), 42);

4. 堆操作(优先队列底层实现)

算法功能示例
std::make_heap将序列构建为堆make_heap(v.begin(), v.end());
std::push_heap向堆中添加元素v.push_back(99); push_heap(v.begin(), v.end());
std::pop_heap从堆中移除堆顶元素pop_heap(v.begin(), v.end()); v.pop_back();
std::sort_heap堆排序sort_heap(v.begin(), v.end());

5. 数值操作(需 <numeric> 头文件)

算法功能示例
std::accumulate累加(或自定义操作)int sum = accumulate(v.begin(), v.end(), 0);
std::inner_product计算内积int dot = inner_product(v1.begin(), v1.end(), v2.begin(), 0);
std::partial_sum计算前缀和partial_sum(v.begin(), v.end(), dest.begin());
std::adjacent_difference计算相邻差值adjacent_difference(v.begin(), v.end(), dest.begin());

6. 其他实用算法

算法功能示例
std::max_element返回最大元素的迭代器auto it = max_element(v.begin(), v.end());
std::min_element返回最小元素的迭代器auto it = min_element(v.begin(), v.end());
std::minmax_element返回最小和最大元素的迭代器(C++11)auto [min_it, max_it] = minmax_element(v.begin(), v.end());
std::lexicographical_compare字典序比较两个序列bool cmp = lexicographical_compare(v1.begin(), v1.end(), v2.begin(), v2.end());
std::next_permutation生成下一个排列next_permutation(v.begin(), v.end());
std::prev_permutation生成上一个排列prev_permutation(v.begin(), v.end());

总结

  • 非修改操作find, count, for_each 等。
  • 修改操作copy, replace, remove, reverse 等。
  • 排序与查找sort, binary_search, lower_bound 等。
  • 堆操作make_heap, push_heap 等。
  • 数值计算accumulate, inner_product(需 <numeric>)。

建议

  • 结合 Lambda 表达式(C++11)灵活定义条件,例如:
    sort(v.begin(), v.end(), [](int a, int b) { return a > b; }); // 降序排序
    
  • 注意算法的复杂度(如 sort 是 O(n log n),find 是 O(n))。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值