1构成
头文件 | 功能 |
---|---|
algorithm | 算法函数 |
numeric | 数值算法 |
functiona | 函数对象/仿函数 |
分类
No. | 分类 | 说明 | 解释 |
---|---|---|---|
1 | 非可变序列算法 | Non-modifying sequence operations | 不直接修改容器内容的算法。 |
2 | 可变序列算法 | Modifying sequence operations | 可以修改容器内容的算法。 |
3 | 排序算法 | Sorting/Partitions/Binary search/ | 对序列排序、合并、搜索算法操作。 |
4 | 数值算法 | Merge/Heap/Min/max | 对容器内容进行数值计算。 |
**注意:**是容器的值和顺序发生改变的算法都是可变序列算法
2具体算法
包括1:填充
2: 遍历/变换
3:最大最小
4:排序算法(12个):提供元素排序策略
1 排序
2 反转/旋转
3 随机
5:查找算法(13个):判断容器中是否包含某个值
1 统计
2 查找
3 搜索
4 边界
6:删除和替换算法(15个)
1:复制
2:移除
3:替换
4:去重
5:交换
7:算术算法(4个)
8:关系算法(4个)
9:集合算法(6个)
10:排列组合算法(2个):提供计算给定集合按一定顺序的所有可能排列组合
11:堆算法(4个)
因为算法函数太多 下面代码中只有一部分使用 其余部分可以看cpul
#include<iostream>
#include<algorithm>
#include<list>
#include<vector>
#include<numeric>
using namespace std;
void func(int n){
cout<<n<<" ";
}
/*迭代器作为参数传入
void my_for_each(beginIt,){
}*/
int square(int n){
return n*n;
}
int add(int a,int b){
return a+b;
}
class Tset{
int n;
public:
Tset(int n):n(n){}
int GetN()const{return n;}
//1:如果对象能够自动比较和排序 需要添加operator<
bool operator<(const Tset& t)const{
return n<t.n;
}
friend ostream& operator<<(ostream& os,const Tset& t){
os<<"Test("<<t.n<<")";
return os;
}
};
//2:可以使用定义比较函数处理
bool compare(const Tset& a,const Tset& b){
return a.GetN()<b.GetN();
}
void Tset_prin(const Tset& t){
cout<<t<<" ";
}
bool than5(const Tset& t){
return t.GetN()>=5;
}
Tset addTset(const Tset& res,const Tset& b){
return Tset(res.GetN()+b.GetN());
}
namespace miniSTL{
template <class IT,class FUNC>
void for_each(IT first,IT last,FUNC func){
while(first!=last)
func(*first++);
}
template <class IT,class FUNC>
int count_if(IT first,IT last,FUNC pred){
int res=0;
while(first!=last){
if(pred(*first++)){
++res;
}
}
return res;
}
template <class IT,class FUNC>
IT remove_if(IT first,IT last,FUNC pred){
IT res=first;
while(first!=last){
if(!pred(*first)){
*res=*first;
++res;
}
++first;
}
return res;
}
template<class IT,class E,class FUNC>
E accumulate(IT first,IT last,E init,FUNC binary){
E res=init;
while(first!=last){
res=binary(res,*first);
first++;
}
return res;
}
}
int main(){
int arr[]={1,2,3,4,5,6,7,8};
list<int> v(arr,arr+8);
//填充
//1:fill fill_n;
//2: generate generate_n
//便历 交换
//1:for_each
for_each(v.begin(),v.end(),func);
cout<<endl;
//2:transform
vector<int> res(v.size());
transform(v.begin(),v.end(),res.begin(),square);
for_each(res.begin(),res.end(),func);
cout<<endl;
transform(v.begin(),v.end(),res.begin(),res.begin(),add);
for_each(res.begin(),res.end(),func);
cout<<endl;
//最大 最小
//1: max(a,b)和max(a,b,cmp)
cout<<max(5,6)<<endl;;
Tset t1(5),t2(6);
cout<<max(t1,t2)<<endl;;
cout<<max(t1,t2,compare)<<endl;
//2:max_element和max_element(a,b,cmp)
vector<Tset> v1;
v1.push_back(t1);
v1.push_back(t2);
v1.push_back(Tset(3));
v1.push_back(Tset(4));;
cout<<*max_element(v1.begin(),v1.end())<<endl;
cout<<*max_element(v1.begin(),v1.end(),compare)<<endl;
//排序
sort(v1.begin(),v1.end(),compare);
miniSTL::for_each(v1.begin(),v1.end(),Tset_prin);
cout<<endl;
//查找
//
//
//统计count 和count_if
cout<<miniSTL::count_if(v1.begin(),v1.end(),than5)<<endl;
//删除
//remove_if 不是真正的删除 只是位置移动
vector<Tset>::iterator n=miniSTL::remove_if(v1.begin(),v1.end(),than5);
//erase是真正的删除
v1.erase(n,v1.end());
for_each(v1.begin(),v1.end(),Tset_prin);
cout<<endl;
//总数
Tset t(0);
cout<<miniSTL::accumulate(v1.begin(),v1.end(),t,addTset)<<endl;
}