algorithm函数详解
2024-02-23 08:08:16
发布于:浙江
废话不多说,直接开始:
1:max
很好理解,求两数更大值,只能放两数,多了不行
用法:
max(a,b)//返回两数较大一个
2:min
求两数更小值,只能放两数,多了不行
用法:
min(a,b)//返回两数较小一个
3:abs
得一个数的绝对值
用法:
abs(x)//返回x的绝对值
用个好理解的:
int abs(int x){
if(x>=0)return x;
else return -x;
}
4:swap
交换两数的值
用法:
swap(a,b)//交换a,b的值
用个好理解的:
void swap(int* a,int* b){//感谢Macw07大佬勘误,这是用指针实现
int tmp = *a;
*a = *b;
*b = tmp;
}
void swap(int &a, int &b) {//Macw07大佬建议使用,较好理解,使用引用的方法实现
int temp = a; a = b; b = temp;
}
5.reverse
翻转x-y区间的数组、容器的值。
用法:
int a[5] = {11,22,33,44,55};
reverse(a,a+5);
for(int i = 0; i < 5; i++)
cout << a[i] << ' ';//翻转整个数组,输出55 44 33 22 11
int a[5] = {11,22,33,44,55};
reverse(a+3,a+5);
for(int i = 0; i < 5; i++)
cout << a[i] << ' ';//对部分值的翻转,输出11 22 33 55 44
vector<int>v;
for(int i = 1; i <= 5; i++)
v.push_back(i);
reverse(v.begin(), v.end());
for(int i = 0; i < v.size(); i++)
cout << v[i] << ' ';//翻转整个容器,输出5 4 3 2 1
vector<int>v;
vector<int>::iterator it;
for(int i = 1; i <= 5; i++)
v.push_back(i);
it = v.begin();
reverse(it, it+3);
for(int i = 0; i < v.size(); i++)
cout << v[i] << ' ';//使用迭代器翻转部分容器,输出3 2 1 4 5
注意:如果想在翻转时指定位数,则其为半开半闭区间。 如reserve(a+2, a+4);翻转数组中第2-4之间的数,不包括第二个但包括第四个。
6:sort
估计有人早就想看这个了,没错!快排sort,对x-y区间的数组、容器进行排序。默认升序排列。
用法:
int a[5] = {55,44,33,22,11};
sort(a,a+5);
for(int i = 0; i < 5; i++)
cout << a[i] << ' ';//默认升序,所以输出11 22 33 44 55
如果要逆序,就要用一个神奇的东西——————函数,来进行控制排序方式
bool cmp(int a, int b) {
return a > b;
}//意为:若a>b,则a的优先级更大,于是乎大的在前面。
阿周的小腿肉补充:sort函数可以用 greater<int>()代替cmp实现逆序
int main(){
int a[5] = {55,44,33,22,11};
sort(a,a+5,cmp);//这里末尾加上自己自定义的函数
for(int i = 0; i < 5; i++)
cout << a[i] << ' ';
}
结构体排序同理
举个栗子:A676.成绩排序
参考代码如下
#include <bits/stdc++.h>
using namespace std;
struct Node{
string name;
int score,id;
} a[1005];//结构体数组
bool cmp(Node x,Node y) {//定义排序优先级
if (x.score != y.score) return x.score > y.score;//按照分数降序排列
else return x.id < y.id;//题干说了分数相同,先列出的排在前面
}
int main() {
int n;
scanf("%d",&n);
for (int i = 1; i <= n; i++) {
cin>>a[i].name>>a[i].score;//输入
//scanf("%s %d",&a[i].name,&a[i].score);想用scanf未遂
a[i].id = i;//为了排序先列出在前要记录顺序
}
sort(a + 1, a + n + 1, cmp);//中心代码,sort排序
for (int i = 1; i <= n; i++)
cout<<a[i].name<<" "<<a[i].score<<endl;//输出
//printf("%s %d",a[i].name,a[i].score);想用printf未遂
return 0;//完美结束
}
sort函数的时间复杂度为O(nlogn),比冒泡、简单排序等效率高 ,所以我天天用sort偷懒,大家别学
注意:sort和reverse函数一样,可以自由指定排序范围,也是半开半闭区间(左闭右开
7.find
查找某数组指定区间x-y内是否有x,若有,则返回该位置的地址,若没有,则返回该数组第n+1个值的地址。
不常用,返回的是地址,懒得换,我也不熟
用法:
int a[5] = {11,22,33,44,55};
int *p = find(a,a+5,33); //定义指针,指向查找完成后返回的地址,5为a2数组长度
if(((p-a) != 5) && (*p == x)) //若同时满足这两个条件,则查找成功,输出
cout << (p-a+1); //输出所在位置 ,为3
容器同理,但我更愿意用容器自身的函数
vector<int>v;
vector<int>::iterator it, it1;
//输入:
for(int i = 0; i < 5; i++)
v.push_back(i);
//查找
int size = v.size(); //第一步:求长度
it = find(v.begin(), v.end(), 3); //第二步:查找x在容器的位置,返回迭代器1
it1 = v.begin(); //第三步:令迭代器2指向容器头
if(((it-it1)!=size)&&(*it==3)) //第四步:若同时满足这两个条件,则查找成功,输出
cout << (it-it1+1) << endl; //输出所在位置 ,为4
8.upper_bound()、lower_bound()
upper_bound():查找第一个大于x的值的位置
lower_bound():查找第一个大于等于x的值的位置
这俩货用的是二分查找,时间复杂度O(logN),可以用于偷懒,大家都要掌握啊,不然怎么偷懒节省代码量
用法:和find一样
9.fill
在区间内填充某一个值。同样适用所有类型数组,容器。
用法:
int a[5];
fill(a,a+5,);
for(int i = 0; i < 5; i++)
cout << a[i] << ' ';//输出:11 33 22 9999 9999
我jio得这个函数可以替代memset,memset的16进制用起来太难受了
10.count
查找一个量在数组或容器中出现的次数
int a[5] = {11,22,33,44,44};
cout << count(a, a+5, 44);//输出4
注意:和reverse,sort等一样,指定区间查询时是半开半闭区间(左闭右开区间)。
11.__gcd
好东西,偷懒用,用于节省代码量
直接上题A691.最大公约数
标准模板题
#include<bits/stdc++.h>//万能头
using namespacece std;
int main(){
int n,m;
cin>>n>>m;//输入
cout<<__gcd(n,m);//输出最大公因数
return 0//没错,没了,完美结束了
}
那有没有最小公倍数函数呢?没错,哎,没有!
之周所众,最小公倍数乘最大公因数的乘积就等于两数之积,所以最小公倍数就是
n*m/__gcd(n,m);
注意:__gcd() 有两个下划线!
就这样吧,就把几个常用的列一下,还有几个求并集,交集和余集以及一个全排列函数,大家可以csdn自行学习,该贴大部分由该网址学习
哎哎哎,先别走啊!三体组织ACGO分部正在持续招人中,欢迎加入啊!!!传送门
还有一个比赛呢!传送门,邀请码G38c,希望大家积极参与
最后!祝大家题题AC,天天快乐
全部评论 23
swap函数的源代码有点问题,最好改成引用传递。因为swap函数并没有返回值,而是直接交换两个变量的值。
2024-02-20 来自
3您指的是哪一行?
2024-02-20 来自 浙江
0理解了大佬,我研究了下发现了
2024-02-20 来自 浙江
0应该是传指针
2024-02-20 来自 浙江
0
给你赞了
2024-02-20 来自 辽宁
1博大胸怀
2024-02-20 来自 浙江
0呵,不过我建议你把第一句话删了
2024-02-20 来自 辽宁
0我觉得我可以去搞STL了
2024-02-20 来自 辽宁
0
你这个时候还在?
2024-04-26 来自 浙江
0......回來刷會題
2024-04-26 来自 浙江
0这次期中你多少
2024-04-26 来自 浙江
0別和我談分數
2024-04-26 来自 浙江
0
hi,请问是如何进入团队邀请赛呢?我不知道邀请码诶
2024-04-02 来自 广东
0G38c
2024-04-04 来自 浙江
0
实用
2024-03-16 来自 浙江
0我突然发现了个有趣的东西:https://www.acgo.cn/discuss/11808
2024-03-09 来自 辽宁
0看看
2024-03-09 来自 辽宁
0我有“轻松”不少
2024-03-09 来自 辽宁
0找到了,最近一周上线一次
2024-03-17 来自 浙江
0
补充一下,sort函数可以用 greater<int>()代替cmp实现逆序
2024-02-22 来自 浙江
0OK,现在加上
2024-02-23 来自 浙江
0
第二个打错了吧,应该是min
2024-02-22 来自 上海
0额,复制下来忘改了,现在改!!!
2024-02-23 来自 浙江
0
没人了吗?顶一下
2024-02-22 来自 浙江
0第二天了,顶一下
2024-02-21 来自 浙江
0洛谷写了道题,再顶
2024-02-20 来自 浙江
0这是干什么?
2024-02-20 来自 辽宁
0额,闲了空的
2024-02-20 来自 浙江
0
洛谷写了道题,再顶
2024-02-20 来自 浙江
0洛谷写了道题,再顶
2024-02-20 来自 浙江
0吃完饭了,再顶
2024-02-20 来自 浙江
0吃完饭了,再顶
2024-02-20 来自 浙江
0吃完饭了,再顶
2024-02-20 来自 浙江
0顶
2024-02-20 来自 浙江
0顶
2024-02-20 来自 浙江
0顶
2024-02-20 来自 浙江
0顶
2024-02-20 来自 浙江
0
有帮助,赞一个