STL常用数值算法

STL常用数值算法

<span style="font-size:18px;">#include<iostream>
#include<vector>
#include<iterator>
#include<algorithm>
#include<functional>
#include<string>
#include<numeric>
using namespace std;
//数值算法
/*
accumulate 累加或者类乘 
partial_sum 局部求和
fill fill_n 填充 初始化时使用方便
equal判断两区间是否相等
for_each 相当于for循环
copy 这个函数用法实在太多</span>
<span style="font-size:18px;">还有一些很简单的数值算法 并未列出
*/
template<class T>
class Display
{
public:
	void operator()(const T& val)
	{
		cout << val << " ";
	}
};
int main(void)
{
	int a[] = { 5,1,3,7,9,-5 };
	int len = sizeof(a) / sizeof(a[0]);
	vector<int> Vec(a,a+len);
	cout << accumulate(Vec.begin(),Vec.end(),0)<<endl;//20
	//数值求和算法 记住最后一个为初值
	cout << accumulate(Vec.begin(), Vec.end(),0, minus<int>())<<endl;//-20
	typedef ostream_iterator<int> O_ITE;
	O_ITE oite(cout," ");
	partial_sum(a,a+3,oite);//5 6 9局部求和 第n个元素为前n个元素的总和 用在map里很好
	cout<<pow(1,0.5);//这个函数有7个重载 所以使用时 不用去理会它的参数
	int a1[10];
	puts("");
	for_each(a1,a1+10,Display<int>());//一堆 乱值
	fill(a1,a1+10,-1);
	puts("");
	for_each(a1,a1+10,Display<int>());//全部为 -1
	fill_n(a1,5,0);//从迭代器开始位置 填充 5个 0
	//返回的迭代器 指向最后一个被填充的下一个位置
	puts("");
	for_each(a1, a1 + 10,Display<int>());//全部为 -1
	iter_swap(a,a1);//这个和c中的使用指针交换 一样 在不同对象的迭代器 也可以使用
	swap(*a,*a1);//C++的引用交换方式
	puts("");
	for_each(a1, a1 + 10, Display<int>());//一堆 乱值
	//Vec.pop_back();
	//这个函数 很奇怪   必须保证第二个区间的元素长度大于等于 第一个区间 否则出错 
	//函数只保证在该区间 两个序列相同 所以要完全相等 必须 同时判断长度
	bool bFlag=equal(a,a+len,Vec.begin());
	if (bFlag)
	{
		puts("\nwe are same!");
	}
	//copy 函数效率很高   使用很频繁 
	int *pAraa = new int[Vec.size()]();
	copy(Vec.begin(), Vec.end(), a);
	//输出区间的起点 与输入区间重叠 可能会出问题(其它情况是不会的)
	//copy 会根据迭代器的性质来决定调用哪个版本的copy
	//对于原生指针 会调用memmove 其它类型会执行实际拷贝操作
	//vector 的指针不仅是个randomiterator 而且是个 T* 因此 拷贝时会使用 memmove
	//与copy类似的还有  copy_backward 只不过 是将一个区间的元素 逆向复制到另一个区间(也是逆向拷贝)
	for_each(a,a+Vec.size(),Display<int>());
	return 0;
}
</span>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值