c++STL算法总结

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;
}	
发布了27 篇原创文章 · 获赞 4 · 访问量 1304

猜你喜欢

转载自blog.csdn.net/weixin_45639955/article/details/104326798