- 本文介绍数值算法:
- accumulate
- adjacent_difference
- inner_product
- partial_sum
- power
- itoa
- 这些算法STL内部实现于<stl_numeric.h>中,应用层实现应该包含头文件<numeric>
一、accumulate
- 功能:默认情况下,用来计算init和[first,last)区间内所有元素的总和
- init一定要提供。这么做的原因是当[first,last)为空区间时仍能获得一个明确的值
- 版本②接受一个仿函数
- 返回值:返回计算出的和
- 版本②中的二元操作符不必满足交换律和结合律
版本①
版本②
演示案例
#include <iostream>
#include <iterator> //ostream_iterator
#include <numeric>
#include <vector>
using namespace std;
int main()
{
int ia[5] = { 1,2,3,4,5 };
vector<int> iv(ia, ia + 5);
//15。计算过程:0+1+2+3+4+5
std::cout << accumulate(iv.begin(), iv.end(), 0) << std::endl;
//-15。计算过程:0-1-2-3-4-5
std::cout << accumulate(iv.begin(), iv.end(), 0, minus<int>()) << std::endl;
return 0;
}
二、adjacent_difference
- 功能:默认情况下,用来计算[first,last)区间内每两个元素之间的差,并将差保存在参数3所指向的result中
- 注意对应关系:result[0]=*first、result[1]=*(first+1)-*(first)、result[1]=*(first+2)-*(first+1)...以此类推
- 版本②接受一个仿函数
- 该函数与partial_sum互为逆运算。例如对区间1、2、3、4、5执行adjacent_difference获得结果为1、1、1、1、1,再对此结果执行partial_sum,便可以得到原始区间值1、2、3、4、5
- 返回值:返回参数3
版本①
版本②
演示案例
#include <iostream>
#include <iterator> //ostream_iterator
#include <numeric>
#include <vector>
using namespace std;
int main()
{
int ia[5] = { 1,2,3,4,5 };
vector<int> iv(ia, ia + 5);
//将这个迭代器绑定到cout上,作为下面的输出
ostream_iterator<int> oiter(std::cout, " ");
//1 1 1 1 1
adjacent_difference(iv.begin(), iv.end(), oiter);
std::cout << std::endl;
//1 3 5 7 9
adjacent_difference(iv.begin(), iv.end(), oiter, plus<int>());
std::cout << std::endl;
return 0;
}
三、inner_product
- 功能:默认情况下,以init参数为初始值,将[first1,last1)区间内的元素与以first2区间开始的元素进行内积(乘)操作,然后将结果返回
- 返回值:返回内积的总和
- 版本②提供两个仿函数参数,第一个用于表示两个区间之间对应元素操作之后是加、还是减等。第二个用于代表函数返回的是[first1,last1)区间与first2区间的各个元素之间是加还是减等
版本①
版本②
演示案例
#include <iostream>
#include <iterator> //ostream_iterator
#include <numeric>
#include <vector>
using namespace std;
int main()
{
int ia[5] = { 1,2,3,4,5 };
vector<int> iv(ia, ia + 5);
//65。计算过程:10 + 1*1 + 2*2 + 3*3 + 4*4 + 5*5
std::cout << inner_product(iv.begin(), iv.end(), iv.begin(), 10) << std::endl;
//-65。计算过程:10 - 1+1 - 2+2 - 3+3 - 4+4 - 5+5
std::cout << inner_product(iv.begin(), iv.end(), iv.begin(), 10,
minus<int>(), plus<int>()) << std::endl;
return 0;
}
四、partial_sum
- 功能:默认情况下,用来计算局部和。在[first,last)区间上,迭代器每移动一次,就将其以及前面所有的元素的值进行一个和,然后保存到存储参数3中
- 形式是result[0]=*first、result[1]=*(first)+*(first+1)、result[1]=*(first)+*(first+1)+*(first+2)...以此类推
- 返回值:参数3
- 备注:运算的时候是从前向后运算,而不是从后向前运算
- 版本②提供一个仿函数,用来指定是每回运算是加还是减等
版本①
版本②
演示案例
#include <iostream>
#include <iterator> //ostream_iterator
#include <numeric>
#include <vector>
using namespace std;
int main()
{
int ia[5] = { 1,2,3,4,5 };
vector<int> iv(ia, ia + 5);
//将这个迭代器绑定到cout上,作为下面的输出
ostream_iterator<int> oiter(std::cout, " ");
//1 3 6 10 15
partial_sum(iv.begin(), iv.end(), oiter);
std::cout << std::endl;
//1 -1 -4 -8 -13
partial_sum(iv.begin(), iv.end(), oiter, minus<int>());
std::cout << std::endl;
return 0;
}
五、power
- 功能:返回某数的n幂次方。这里的n幂次是指自己对自己进行某种运算达n次
- 运算类型可由外界指定。例如指定乘法,那就是乘幂
版本①
版本②
六、itoa
- 功能:把区间[first,last)内的元素依次改变为:*(first)=value、*(first+1)=value+1、*(first+2)=value+2...、*(first+(last-first-1))=value+(last-first-1)
- 无返回值
- 属于质变算法
源码
演示案例
#include <iostream>
#include <iterator> //ostream_iterator
#include <numeric>
#include <vector>
using namespace std;
int main()
{
int ia[5] = { 1,2,3,4,5 };
vector<int> iv(ia, ia + 5);
int n = 3;
iota(iv.begin(), iv.end(), n);
//3 4 5 6 7
for (int i = 0; i < iv.size(); ++i)
std::cout << iv[i] << " ";
std::cout << std::endl;
return 0;
}