蒟蒻对algorithm的认知

algorithm 是C++标准程式库中的一个头文件,定义了C++ STL标准中的基础性的算法(均为函数模板)
我觉得algorithm 真的是一个作弊库!!!

数学
1 max(a,b),min(a,b) :返回a,b中的较大/小值,a,b必须是同种类型的元素
2 abs(x) :取绝对值。
3 fabs(x) :取实数的绝对值时,比abs精度更高。
4 swap(a,b) :交换a,b的值,也可以交换数组/STL,交换数组/STL时,由于是交换指针,所以是 O(1) 的。

sort
排序,左闭右开,复杂度 O(nlog n) ,比手写快排快多了。
排序数组: sort(a+1,a+1+n);
排序STL: sort(a.begin(),a.end());
自定义比较函数:
1 bool cmp(int x,int y) {return x>y;}
2 int main()
3 {
4 sort(a+1,a+1+n,cmp); //从⼤到⼩排序
5 return 0;
6 }
sort默认从小到大排序,举个栗子
蒟蒻对algorithm的认知_第1张图片
sort(数组名,数组名+长度),便可实现排序
如果要从大到小排序,就这样子
蒟蒻对algorithm的认知_第2张图片
reverse

区间翻转,左闭右开,复杂度 O(n) ,比手动翻转快。
数组:reverse(a+1,a+1+n);
STL:reverse(a.begin(),a.end());
也可以理解为倒序。。。。
举个栗子:
蒟蒻对algorithm的认知_第3张图片
lower_bound

二分查找,寻找指定区间内第一个大于等于给定权值的值,并返回指针或迭代器,复杂度 O(nlog n) ,比手写二分查找快。

要查找的区间必须按从小到大顺序有序,才能保证返回正确的结果。

还有一个upper_bound,用于查找第一个严格大于给定权值的元素的位置。

for(int i=1;i<=n;++i) a[i]=i;
int k=lower_bound(a+1,a+1+n,3)-a;
cout<

unique

去重,原理是将所有重复的元素都堆在序列最后⾯,然后假装它们不存在,返回尾指针/迭代器。要求序列按从小到大有序。

例如你想将 a 这个int类型的数组去重:

int len=unique(a+1,a+1+n)-a-1;
下面是我自己写的函数,可以对数组中的重复元素进行去除

#include //C++万能头文件
using namespace std;
void unique(int a[], int n);
int a1[10000];
int main()
{
int n1;
cin >> n1;
for (int i = 0; i < n1; i++)
cin >> a1[i];
unique(a1, n1);
return 0;
}
void unique(int a[], int n)//去重函数
{
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j <= i; j++)
{
if (a[i] == a[j])
break;
}
if (i == j)
cout << a[i] << " ";
}
cout << endl;
}
我真的是个蒟蒻,刚刚学习C/C++,算是记录学习的心得吧

你可能感兴趣的:(蒟蒻对algorithm的认知)