算法笔记6.9 algorithm头文件下常用函数

本文深入探讨C++标准模板库(STL)中的关键算法,包括max(), min(), abs(), max_element(), min_element(), swap(), reverse(), next_permutation(), fill(), sort(), lower_bound(), upper_bound()等函数的用法与应用场景,同时讲解了find(), set操作,以及一些实用技巧如pow(), transform()等。

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

目录

1.max(),min(),abs()

2.max_element()和min_element()求数组集合以及结构体中最大最小值

3.swap(x,y)  其实不在algorithm里

4.reverse()

5.next_permutation()

6.fill()

7.sort()

8.lower_bound()和upper_bound()

补充:

日积月累

1.find(begin,end,n)

2.求集合交并差

3.swap  不需要algorithm头文件 c++ std标准空间中就有

4.pow

5、transform  string字符串大小写转换


1.max(),min(),abs()

求x,y,z中的最大值 :max(x,max(y,z))

abs(x)  x只能是int型,要求浮点数绝对值,还是要用cmath下的fabs

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
	int x=1,y=-2;
	cout<<max(x,y)<<" "<<min(x,y)<<endl;
	cout<<abs(x)<<" "<<abs(y)<<endl;
	return 0;
}

2.max_element()和min_element()求数组集合以及结构体中最大最小值

#include<iostream>
#include<vector>
#include <string>
#include<algorithm>
using namespace std;

struct my
{
	string name;
	int age;
	my(string name,int age){
		this->name=name;
		this->age=age;
	}
	my(){}
}My[5];

bool cmp(my m1,my m2){
	return m1.age<m2.age;
}


int main(){
	int a[12]={89,78,12,0,-88, 977,89,2,3,4, 0,-987};
	cout<<"maxA:"<<*max_element(a,a+12)<<endl;
	cout<<"minA:"<<*min_element(a,a+12)<<endl;

	vector<string> vi;
	vi.push_back("c++");
	vi.push_back("java");
	vi.push_back("c#");
	vi.push_back("python");
	cout<<"\nmaxV:"<<*max_element(vi.begin(),vi.end())<<endl;
	cout<<"minV:"<<*min_element(vi.begin(),vi.end())<<endl;

	//结构体求max,min借助vector
	My[0]=my("han",10);
	My[1]=my("liu",20);
	My[2]=my("yang",18);
	My[3]=my("tom",25);
	My[4]=my("tony",30);
	vector<my> vm;
	for(int i=0;i<5;i++){
		vm.push_back(My[i]);
	}
	cout<<"\nmaxS:"<<(*max_element(vm.begin(),vm.end(),cmp)).name<<endl;
	cout<<"minS:"<<(*min_element(vm.begin(),vm.end(),cmp)).name<<endl;

	return 0;
}

3.swap(x,y)  其实不在algorithm里

交换x,y的值

#include<iostream>
using namespace std;
int main(){
	int x=1,y=2;
	cout<<"x="<<x<<" y="<<y<<endl;
	swap(x,y);
	cout<<"x="<<x<<" y="<<y<<endl;
	return 0;
}

4.reverse()

reverse(it1,it2);反转[it1,it2)内的元素

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main(){
	int a[5]={1,2,3,4,5};
	for(int i=0;i<5;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
	reverse(a,a+5);
	for(int i=0;i<5;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;

	cout<<endl;
	string str="0123456";
	cout<<str<<endl;
	reverse(str.begin()+2,str.begin()+5);//[2,5)反转2 3 4
	cout<<str<<endl;

	return 0;
}

5.next_permutation()

给出一个序列在全排列中的下一个序列

123
132
213
231
312
321

则231下一个全排列就是312

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
	int a[3]={1,2,3};//初值赋值为123 就能求出全排列
	do{
		printf("%d %d %d\n", a[0],a[1],a[2]);
	}while(next_permutation(a,a+3));
	return 0;
}

6.fill()

把数组或者容器内某一段区间赋值为某个相同的值。和memset不同,这里的赋值可以是数组类型对应范围的任何值。

12.memset函数 memset(数组名,值,sizeof(数组名)) (需要#include<string.h>)  memset按字节赋值,每个字节赋一样的值,由于0的二进制补码全为0,-1的二进制补码全为1,初学赋值0,-1不易弄错,赋其他值要用fill函数

eg:memset(a,0,sizeof(a))全部赋值0

13.fill函数   fill(a,a+5,233)数组

a[0]~a[4]均赋值为233  比memset好用,不过效率低一些,且包含在algorithm里

初始化二维数组a[N][N]为k    fill(a[0],a[0]+N*N,k);

​
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
	int a[5]={1,2,3,4,5};
	fill(a,a+5,1998);
	for(int i=0;i<5;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
	return 0;
}

​

二维数组初始化

#include<bits/stdc++.h>
using namespace std;

const int N=10;
int vis[N][N];

int main(){
	fill(vis[0],vis[0]+N*N,10);
	for(int i=0;i<N;i++){
		for(int j=0;j<N;j++){
			cout<<vis[i][j]<<" ";
		}
		cout<<endl;
	}
	return 0;
}

7.sort()

讲得太多了,写的也很熟悉了,就就写个容器的排序了

vector、string,deque才可以使用sort  因为map,set底层红黑树本来就有序了

容器排序写个容器内元素类型的比较器即可,作为第三个参数,类似结构体排序

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

bool cmp(int a,int b){
	return a<b;
}

int main(){
	vector<int> vi;	
	vi.push_back(3);
	vi.push_back(1);
	vi.push_back(2);
	sort(vi.begin(),vi.end(),cmp);
	for(int i=0;i<vi.size();i++){
		cout<<vi[i]<<" ";
	}
	cout<<endl;
	return 0;
}

8.lower_bound()和upper_bound()

lower_bounder(first,last,val):
寻找数组或容器的[first,last)范围内第一个值大于等于val的元素的位置,数组返回指针,容器返回迭代器

upper_bounder(first,last,val):
寻找数组或容器的[first,last)范围内第一个值大于val的元素的位置,数组返回指针,容器返回迭代器

若数组或者容器中没有需要寻找的元素,则返回可以插入该元素的位置或者指针

注意:所操作的数组或者迭代器首先必须是有序的

#include<iostream>
#include<algorithm>
using namespace std;

int a[10]={1,2,2,3,3,3,5,5,5,5};

void findN(int n){
	int* lowerPos=lower_bound(a,a+10,n);
	int* upperPos=upper_bound(a,a+10,n);
	cout<<n<<":"<<lowerPos-a<<" "<<upperPos-a<<endl;
}

int main(){
	findN(-1);
	findN(1);
	findN(3);
	findN(4);
	findN(6);
	return 0;
}

本节练习:https://blog.csdn.net/hza419763578/article/details/88422964

-----------------------------------------------------------------------------------------------------------------------------------------------------------------


补充:

日积月累

1.find(begin,end,n)

从指针范围[begin,end)内查找n,若n存在返回n的地址,否则返回地址end.无法返回下标,可用于普通数组,用于vector时功能强大

样例:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
	int num[5]={1,5,6,8,9};
	//找到返回地址
	cout<<find(num,num+5,9)<<endl;//返回6号元素的地址
	cout<<*find(num,num+5,9)<<endl;

	//没找到返回最后一个地址的下一个地址
	cout<<find(num,num+5,10)<<endl;//返回6号元素的地址
	
	/********************在vector里极其好用********************/
	vector<int> vi;
	for(int i=1;i<=5;i++){
		vi.push_back(i);
	}
	cout<<"vector中有:";
	for(int i=0;i<vi.size();i++) cout<<vi[i]<<" ";
	cout<<endl;
	int n;
	vector<int>::iterator it;
	while(cin>>n){
		it=find(vi.begin(),vi.end(),n);//[vi.begin(),vi.end())内找n
		if(it!=vi.end()){
			cout<<"找到"<<*it<<endl;
		}else{
			cout<<"未找到"<<endl;
		}
	}


	return 0;
}

判断数组中有无指定元素

#include<iostream>
#include<algorithm>
using namespace std;
//判断一列数中有无指定元素
int main(){
	int a[10]={1,3,5,7,9,20,45,-86,-100,-300};
	int x;
	cout<<"数组a:";
	for(int i=0;i<10;i++) cout<<a[i]<<" ";
	cout<<endl;
	while(cin>>x){
		if(find(a,a+10,x)!=a+10){//失败返回最后一个元素地址的下一个地址 否则返回该元素 类似于vector中的!=v.end()
			cout<<"有"<<x<<endl;
		}else{
			cout<<"没有"<<x<<endl;
		}
		/*//不能这么判断 似乎没有找到就将查找的值x插入第一个查找失败的地址了
		if(*find(a,a+10,x)==x){
			cout<<"有"<<x<<endl;
		}else{
			cout<<"没有"<<x<<endl;
		}*/
	}

	return 0;
}

2.求集合交并差

set_union(s1.begin(),s1.end(),s2.begin(),s2.end(),back_inserter(c));//并 

set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end(),back_inserter(c));//交

set_difference(s1.begin(),s1.end(),s2.begin(),s2.end(),back_inserter(c));//差   s1-s2

结果都在vector  c里面

set集合自带强大API

求集合交并补

#include<iostream>
#include<set>
#include<vector>
using namespace std;
int main(){
	set<int> a,b;
	vector<int> c;
	a.insert(2);a.insert(4);a.insert(6);//2 4 6
	b.insert(1);b.insert(2);b.insert(3);b.insert(4);b.insert(5);//1 2 3 4 5
	cout<<"a:2 4 6\nb:1 2 3 4 5\n";

	//a,b不一定是set,但一定有序
	set_union(a.begin(),a.end(),b.begin(),b.end(),back_inserter(c));//并集
	cout<<"a并b:";
	for(int i=0;i<c.size();i++) cout<<c[i]<<" ";puts("");
	c.clear();

	//交集
	set_intersection(a.begin(),a.end(),b.begin(),b.end(),back_inserter(c));
	cout<<"a交b:";
	for(int i=0;i<c.size();i++) cout<<c[i]<<" ";puts("");
	c.clear();

	set_difference(a.begin(),a.end(),b.begin(),b.end(),back_inserter(c));
	cout<<"a差b:";
	for(int i=0;i<c.size();i++) cout<<c[i]<<" ";puts("");
	c.clear();

	puts("");
	return 0;
}

3.swap  不需要algorithm头文件 c++ std标准空间中就有

string都可以交换

#include<iostream>
using namespace std;
int main(){
	int a=1,b=2;
	swap(a,b);
	cout<<a<<" "<<b<<endl;
	
	char c[3]={'x','y','\0'};
	swap(c[0],c[1]);
	cout<<c<<endl;
	
	string s1="123",s2="abc";
	swap(s1,s2);
	cout<<s1<<" "<<s2<<endl;
	 
	return 0;
}

4.求数组中一列数字的和以及平均值     accumulate:积累    accumulate(a,a+N,0.0)求和    /N平均值

#include<iostream>
#include<numeric>
using namespace std;
int main(){
	const int N=6;
	int a[N]={1,2,3,4,5,7};
	cout<<22/6.0<<endl;
	cout<<accumulate(a,a+6,0.0)/N<<endl;
	cout<<22/6<<endl;
	cout<<accumulate(a,a+6,0)/N<<endl;
	return 0;
}

4.pow

c语言函数,不仅可以求乘方,还可以求开方

a的n次方     pow(a,n)
n次根号a     pow(a,1.0/n)

#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<pow(2,10)<<endl;
	cout<<pow(1024,1.0/10)<<endl;
	cout<<pow(456,0.5);
	return 0;
}

5、transform  string字符串大小写转换

c++ string字符串 大小写转换  地址修改,保存在原str中 
transform(str.begin(), str.end(), str.begin(), ::tolower);//->小写 
transform(str.begin(), str.end(), str.begin(), ::toupper);//->大写

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main(){
	string str="ABCabc";
	
	transform(str.begin(),str.end(),str.begin(),::tolower);
	cout<<str<<endl;
	
	transform(str.begin(),str.end(),str.begin(),::toupper);
	cout<<str<<endl;
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值