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;
}