STL标准库的数值算法详解(accumulate,inner_product,partial_sum,adjacent_difference函数详细解释)

数值算法是对容器的内容进行数值计算

STL的数值算法实现了四种类型的计算即加减乘除,可以在一个值序列上进行这些计算,数值算法如表所示:

函数 说明
accumulate(first,last,init) 计算结果是所有元素之和加上init的值,返回值是一个数的类型
inner_product(fist,last,first2,init) 计算结果是相应的元素相乘并且求和,求和后的值加上init即为最后的结果
partial_sum(first,last,result) 计算结果是第n个元素是前n项(包含本身)元素之和,result是保存最终结果的一个容器
adjacent_difference(first,last,result) 计算结果是第n项元素是第n项减去n-1项的结果,result是保存结果的容器

代码实现如下,代码中有对四种函数的详细解释说明:

#include<iostream>
#include<vector>
#include<algorithm>
#include<numeric> 	//需要加入数值算法的头文件 
using namespace std;
void output(int val)
{
	cout << " " << val;
}
int multi(int a,int b)
{
	return a*b;
}
int main()
{
	vector<int> ivc1,ivc2;
	int n,x;
	cout << "请输入元素个数:" << endl;
	cin >> n;
	cout << "请输入各个元素的值:" << endl;
	for(int i = 0; i < n; i++)
	{
		cin >> x;
		ivc1.push_back(x);
	}
	for(int i = 0; i < n; i++)
	{
		cin>>x;
		ivc2.push_back(x);
	}
	cout << "ivc1:" << endl;
	for_each(ivc1.begin(),ivc1.end(),output);
	cout << endl;
	cout << "ivc2:" << endl;
	for_each(ivc2.begin(),ivc2.end(),output);
	cout << endl << endl;
	
	/*
		今天详细介绍一下数值算法嘿嘿
		数值算法是对容器中的内容进行数值上的计算
		STL的数值算法实现了4种类型的计算,可以在一个值序列上进行这些计算。
	*/ 
	/*
		using accumulate(first,last,init)
		first是指 指向第一个元素的迭代器,last是指 指向最后一个元素的迭代器,init是一个数值,与容器之中的元素求和 
		accumulate 算法是用来对该容器进行累加求和的算法,返回一个最终累加的结果
	*/ 
	int result = accumulate(ivc1.begin(),ivc1.end(),7);
	cout << "After accumulate():" << endl;
		cout << result<<endl<<endl;
	
	/*
		inner_product(first,last,first2,init)
		first,last,first2都是指容器中的开始结尾的迭代器
		而init是在两个容器对应元素相乘后加上的元素
		具体代码如下: 
	*/
	cout << "After inner_product():" << endl;
	int inner1 = inner_product(ivc1.begin(),ivc1.end(),ivc2.begin(),0);
	cout << "init = 0:" << endl;
	cout << inner1 << endl; 
	int inner2 = inner_product(ivc1.begin(),ivc1.end(),ivc2.begin(),2);
	cout << "init = 2:" << endl;
	cout << inner2 << endl;
	cout << endl;
	
	/*
		partial_sum(first,last,result)
		first,last都是指向容器的一个迭代器 
		1.容器要计算的起始位置,容器要计算的结束位置,结果存放的起始位置 
		2.容器要计算的起始位置,容器要计算的结束位置,结果存放的起始位置,自定义函数
		局部求和,第一个元素是本身,第二个元素是1.2元素之和,第三个元素是1.2.3元素之和,以此类推。 
	*/ 
	
	cout << "After partial_sum():" << endl;
	partial_sum(ivc1.begin(),ivc1.end(),ivc2.begin());
	cout << "Use partial deal with ivc1:" << endl;
	for_each(ivc2.begin(),ivc2.end(),output);
	cout << endl;
	partial_sum(ivc1.begin(),ivc1.end(),ivc2.begin(),multi);
	cout << "Use partial(multi) deal with ivc1:" << endl;
	for_each(ivc2.begin(),ivc2.end(),output);
	cout << endl << endl;
	
	/*
		adjacent_difference(first,last,result)
		(容器所要计算的起始位置,容器所要计算的结束位置,计算结果的存储的起始位置) 
		第一个元素是本身,第二个元素是2-1的结果,第三个元素是3-2的结果,以此类推 
	*/	
	cout << "After adjacent_difference():" << endl;
	adjacent_difference(ivc1.begin(),ivc1.end(),ivc2.begin());
	for_each(ivc2.begin(),ivc2.end(),output);
	cout << endl;
}

运行的结果如下图所示:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5L6v5LiN6Lq65bmzLg==,size_14,color_FFFFFF,t_70,g_se,x_16

具体的详细解释请看代码段之间的文字说明,大家可以自己动手试着去修改一下代码来实现自己想完成的算法,动手做一做会比纯靠脑子想会好很多。 

猜你喜欢

转载自blog.csdn.net/m0_61886762/article/details/124224837