C++算法库<algorithm>

C++标准库中的<algorithm>头文件提供了一组用于操作容器(如数组、向量、列表等)的算法。这些算法包括排序、搜索、复制、比较等。

<algorithm>头文件定义了一组模板函数,这些函数可以应用于任何类型的容器,只要容器支持迭代器。这些算法通常接受两个或更多的迭代器作为参数,表示操作的起始和结束位置。

语法

algorithm_name(container.begin(),container.end(),...);

container是一个容器对象,beegin()和end()是容器的成员函数,返回指向容器开始和结束的迭代器。

1.排序算法

函数:sort

语义:对容器中的元素进行排序。

语法:sort(container.begin(),container.end(),compare_function);

参数1:数组的首地址,一般是数组名或者迭代器。

参数2:要排序数据的尾地址。

参数3:是一个可选的比较函数,用于自定义排序方式。默认升序排序。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//自己编写排序规则函数 
bool compare(int a,int b){
	return a>b;//降序 
}
int main(){
	//1.默认 
	vector<int> numbers={5,2,9,1,5,6};
	sort(numbers.begin(),numbers.end());
	for(int num:numbers){
		cout<<num<<" ";
	}
	cout<<endl;
	//2.带第三个参数 
	vector<int> numbers1={5,2,9,1,5,6};
	sort(numbers1.begin(),numbers1.end(),compare);
	for(int num:numbers1){
		cout<<num<<" ";
	}
	cout<<endl;
	//3.对部分区间排序,前n个元素为有序 
	vector<int> a={5,2,9,1,5,6};
	partial_sort(a.begin(),a.begin()+3,a.end());
	for(int num:a){
		cout<<num<<" ";
	}
	cout<<endl;
	//4.稳定排序,保留想等元素的相对顺序
	vector<int> b={5,2,9,1,5,6};
	stable_sort(b.begin(),b.end());
	for(int num:b){
		cout<<num<<" ";
	} 
	cout<<endl;
	//数组排序 
	int a[]={5,2,9,1,5,6};
	sort(a,a+6);
	for(int num:a){
		cout<<num<<" ";
	} 
	cout<<endl;

	return 0;
}

2.搜索算法

函数:find

定义:在容器中查找与给定值匹配的第一个元素。

语法:auto it=find(container.begin(),container.end(),value);

如果找到,it将指向匹配的元素;如果没有找到,it将等于container.end()

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

int main(){
	//1.find 
	vector<int> numbers={1,2,3,4,5};
	auto it=find(numbers.begin(),numbers.end(),3);
	if(it!=numbers.end()){
		cout<<"Found:"<<*it<<endl;
	}else{
		cout<<"Not"<<endl;
	}
	//2.binary_search:对有序区间进行二分查找 
	vector<int> numbers1={1,2,3,4,5};
	sort(numbers1.begin(),numbers1.end());//先排序
	bool found=binary_search(numbers1.begin(),numbers1.end(),4); 
	if(found)
		cout<<"Yes"<<endl;
	else
		cout<<"Not"<<endl;
	//3.find_if:查找第一个满足特定条件的元素 
	vector<int> a={1,2,3,4,5};
	auto it1=find_if(a.begin(),a.end(),[](int x){return x>3;});
	cout<<*it1<<endl;
	return 0;
}

3.复制算法

函数:copy

定义:将一个范围内的元素复制到另一个容器或数组。

语法:copy(source_begin,source_end,destination_begin);

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

int main(){
	//1.copy
	vector<int> source={1,2,3,4,5};
	int destination[5];
	copy(source.begin(),source.end(),destination);
	for(int i=0;i<5;i++){
		cout<<destination[i]<<" ";
	}
	return 0;
}

4.比较算法

函数:equal

定义:比较两个容器或两个范围内的元素是否相等。

语法:bool result=equal(first1,last1,first2);或bool result=equal(first1,last1,first2,compare_function);

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

int main(){
	//1.equal
	vector<int> v1={1,2,3,4,5};
	vector<int> v2={1,2,3,4,5};
	bool are_equal=equal(v1.begin(),v1.end(),v2.begin());
	cout<<(are_equal?"Yes":"No")<<endl;;
	return 0;
}

5.修改算法

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

int main(){
	vector<int> a={1,2,3,4,5};
	reverse(a.begin(),a.end());//反转区间内的元素 
	fill(a.begin(),a.end(),0);//将指定区间内的所有元素赋值为某个值,所有元素设为0 
	replace(a.begin(),a.end(),0,6);//将区间内的某个值替换为另一个值,所有0替换为6 
	vector<int> b(5);
	copy(a.begin(),a.end(),b.begin());//将区间内的元素复制到另一个区间 
	for(int num:a){
		cout<<num<<" ";
	}
	return 0;
}

6.排列算法

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

int main(){
	vector<int> a={1,2,3};
	do{
		for(int n:a)
			cout<<n<<" ";
		cout<<endl;
	}while(next_permutation(a.begin(),a.end()));//生成字典序的下一个排列 
	vector<int> b={4,5,6};
	do{
		for(int n:b)
			cout<<n<<" ";
		cout<<endl;
	}while(prev_permutation(b.begin(),b.end()));//生成字典序的上一个排列 
	return 0;
}

7.归并算法

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

int main(){
	vector<int> a={1,3,5};
	vector<int> b={2,4,6};
	vector<int> result(6);
	//将两个有序区间合并到一个有序区间 
	merge(a.begin(),a.end(),b.begin(),b.end(),result.begin());
	for(int num:result){
		cout<<num<<" ";
	}
	cout<<endl;
	//在单个区间中合并两个有序子区间
	vector<int> vec={1,3,5,2,4,6};
	inplace_merge(vec.begin(),vec.begin()+3,vec.end()); 
	for(int num:vec){
		cout<<num<<" ";
	}
	return 0;
}

8.集合算法

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

int main(){
	vector<int> a={1,3,5};
	vector<int> b={2,4,6};
	vector<int> result(6);
	//计算两个有序集合的并集 
	auto it=set_union(a.begin(),a.end(),b.begin(),b.end(),result.begin());
	result.resize(it-result.begin());
	for(int num:result){
		cout<<num<<" ";
	}
	cout<<endl;
	vector<int> result1(6);
	//计算两个有序集合的并集 
	auto it1=set_intersection(a.begin(),a.end(),b.begin(),b.end(),result1.begin());
	result1.resize(it1-result1.begin());
		for(int num:result1){
		cout<<num<<" ";
	}
	cout<<endl;
	vector<int> result2(6);
	//计算集合的差集 
	auto it2=set_difference(a.begin(),a.end(),b.begin(),b.end(),result2.begin());
	result2.resize(it2-result2.begin());
	for(int num:result2){
		cout<<num<<" ";
	}
	return 0;
}

9.其他有用算法

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

int main(){
	vector<int> a={1,3,5};
	//计算范围内元素的累计和 
	int sum=accumulate(a.begin(),a.end(),0);
	cout<<sum<<endl;
	vector<int> b={2,4,6};
	//对区间内的每个元素执行操作 
	for_each(b.begin(),b.end(),[](int &x){x+=1;});
	for(int num:b){
		cout<<num<<" ";
	}
	cout<<endl;
	//查找区间内的最小值和最大值 
	auto min_it=min_element(a.begin(),a.end());
	auto max_it=max_element(a.begin(),a.end());
	cout<<*min_it<<*max_it<<endl;

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值