C++篇——stl算法函数总概

本文详细介绍了C++ STL中的算法,包括不变序列算法、变值算法、删除算法、变序算法、排序算法以及有序区间算法。不变序列算法不会修改容器,如`min_element`和`max_element`;变值算法如`transform`会修改元素值;删除算法如`unique`不减少元素数量但移除重复;变序算法如`random_shuffle`打乱顺序;排序算法如`sort`实现O(nlog(n))复杂度的排序;有序区间算法则针对已排序区间进行操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

stl算法类别

• 不变序列算法
• 变值算法
• 删除算法
• 变序算法
• 排序算法
• 有序区间算法
• 数值算法

大多重载的算法都是有两个版本的
• 用 “==” 判断元素是否相等, 或用 “<” 来比较大小
• 多出一个类型参数 “Pred” 和函数形参 “Pred op” :
通过表达式 “op(x,y)” 的返回值: ture/false
判断x是否 “等于” y,或者x是否 “小于” y
如下面的有两个版本的min_element:
iterator min_element(iterator first, iterator last);
iterator min_element(iterator first, iterator last, Pred op);

不变序列算法

  • 该类算法不会修改算法所作用的容器或对象
  • 适用于顺序容器和关联容器
  • 时间复杂度都是O(n)
min 					求两个对象中较小的(可自定义比较器)
max 					求两个对象中较大的(可自定义比较器)
min_element   			求区间中的最小值(可自定义比较器)
max_element   			求区间中的最大值(可自定义比较器)
for_each 				对区间中的每个元素都做某种操作
count 					计算区间中等于某值的元素个数
count_if 				计算区间中符合某种条件的元素个数
find 					在区间中查找等于某值的元素
find_if 				在区间中查找符合某条件的元素
find_end 				在区间中查找另一个区间最后一次出现的位置(可自定义比较器)
find_first_of 			在区间中查找第一个出现在另一个区间中的元素 (可自定义比较器)
adjacent_find 在		区间中寻找第一次出现连续两个相等元素的位置(可自定义比较器)
search 					在区间中查找另一个区间第一次出现的位置(可自定义比较器)
search_n 				在区间中查找第一次出现等于某值的连续n个元素(可自定义比较器)
equal 					判断两区间是否相等(可自定义比较器)
mismatch 				逐个比较两个区间的元素,返回第一次发生不相等的两个元素的位置(可自定义比较器)
lexicographical_compare 按字典序比较两个区间的大小(可自定义比较器)

min_element和max_element的实例
重载小于号运算符后,取数组中的最大和最小值

#include <iostream
>
#include <algorithm>
using namespace std
;
class A {
public:
int n;
A(int i):n(i) { }
};
bool operator<( const A & a1, const A & a2) {
cout << “< called” << endl
;
if( a1.n == 3 && a2.n == 7 )
return true;
return false;
}
int main() {
A aa[] = { 3,5,7,2,1 };
cout << min_element(aa,aa+5)->n << endl;
cout << max_element(aa,aa+5)->n << endl;
return 0;
}
/*
输出:
< called
< called
< called
< called
3
< called
< called
< called
< called
7
*/

2.变值算法

此类算法会修改源区间或目标区间元素的值,值被修改的那个区间, 不可以是属于关联容器的

for_each 				对区间中的每个元素都做某种操作
copy 					复制一个区间到别处
copy_backward 			复制一个区间到别处, 但目标区前是从后往前被修改的
transform 				将一个区间的元素变形后拷贝到另一个区间
swap_ranges 			交换两个区间内容
fill 					用某个值填充区间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值