//STL之数值算法
//学习目的:学习数值算法的使用
/*
根据迭代器increment(累加)特性,迭代器可以分为5累。每一个STL算法的声明,都表现出它所需要的最低
程度的迭代器类型。例如:find()需要一个inputiterator,这是它的最低要求,但它可以接受更高类型的
迭代器,如forwarditerator。将无效的迭代器传给某个算法,虽然是一种错误,却不保证能够在编译时期
就被捕捉出来。因为,所谓的"迭代器类型"并不是真实的类型,它们只是functions template的一种型别
参数。
质变算法(会改变操作对象之值)通常提供两个版本:一个是in-place(就地进行)版,就地改变其操作对象;
另一个是copy(另地进行)版,将操作对象的内容复制一份副本,然后在副本上进行修改并返回该副本。
//本程序代码来源《STL源码剖析》
*/
//file:6numeric.cpp
#include <numeric>
#include <vector>
#include <functional>
#include <iostream>
#include <iterator> //ostream_iterator
using namespace std;
int main()
{
int ia[5] = {1, 2, 3, 4, 5};
vector<int> iv(ia, ia + 5);
cout << accumulate(iv.begin(), iv.end(), 0) << endl; //第三个参数做为初值
//15, 1.e. 0 + 1 + 2 + 3 + 4 + 5
cout << accumulate(iv.begin(), iv.end(), 0, minus<int>()) << endl;
//-15, 1.e. 0 - 1 - 2 - 3 - 4 - 5
cout << inner_product(iv.begin(), iv.end(), iv.begin(), 10) << endl;
//65, 1.e. 10 + 1*1 + 2*2 + 3*3 + 4*4 + 5*5
cout << inner_product(iv.begin(), iv.end(), iv.begin(), 10, minus<int>(), plus<int>()) << endl;
//-20, 1.e. 10 - 1+1 - 2+2 - 3+3 - 4+4 - 5+5
//以下这个迭代器将绑定到cout作为输出用
ostream_iterator<int> oite(cout, " ");
partial_sum(iv.begin(), iv.end(), oite);//第n个新元素是前n个旧元素的相加总计
//1 3 6 10 15
partial_sum(iv.begin(), iv.end(), oite, minus<int>());//第n个新元素是前n个旧元素的运算总计
//1 -1 -4 -8 -13
adjacent_difference(iv.begin(), iv.end(), oite);//#1元素照录,#n新元素等于#n旧元素 - #n-1旧元素
//1 1 1 1 1
adjacent_difference(iv.begin(), iv.end(), oite, plus<int>());//#1元素照录,#n新元素等于op(#n旧元素,#n-1旧元素)
//1 3 5 7 9
getchar();
}
//学习目的:学习数值算法的使用
/*
根据迭代器increment(累加)特性,迭代器可以分为5累。每一个STL算法的声明,都表现出它所需要的最低
程度的迭代器类型。例如:find()需要一个inputiterator,这是它的最低要求,但它可以接受更高类型的
迭代器,如forwarditerator。将无效的迭代器传给某个算法,虽然是一种错误,却不保证能够在编译时期
就被捕捉出来。因为,所谓的"迭代器类型"并不是真实的类型,它们只是functions template的一种型别
参数。
质变算法(会改变操作对象之值)通常提供两个版本:一个是in-place(就地进行)版,就地改变其操作对象;
另一个是copy(另地进行)版,将操作对象的内容复制一份副本,然后在副本上进行修改并返回该副本。
//本程序代码来源《STL源码剖析》
*/
//file:6numeric.cpp
#include <numeric>
#include <vector>
#include <functional>
#include <iostream>
#include <iterator> //ostream_iterator
using namespace std;
int main()
{
int ia[5] = {1, 2, 3, 4, 5};
vector<int> iv(ia, ia + 5);
cout << accumulate(iv.begin(), iv.end(), 0) << endl; //第三个参数做为初值
//15, 1.e. 0 + 1 + 2 + 3 + 4 + 5
cout << accumulate(iv.begin(), iv.end(), 0, minus<int>()) << endl;
//-15, 1.e. 0 - 1 - 2 - 3 - 4 - 5
cout << inner_product(iv.begin(), iv.end(), iv.begin(), 10) << endl;
//65, 1.e. 10 + 1*1 + 2*2 + 3*3 + 4*4 + 5*5
cout << inner_product(iv.begin(), iv.end(), iv.begin(), 10, minus<int>(), plus<int>()) << endl;
//-20, 1.e. 10 - 1+1 - 2+2 - 3+3 - 4+4 - 5+5
//以下这个迭代器将绑定到cout作为输出用
ostream_iterator<int> oite(cout, " ");
partial_sum(iv.begin(), iv.end(), oite);//第n个新元素是前n个旧元素的相加总计
//1 3 6 10 15
partial_sum(iv.begin(), iv.end(), oite, minus<int>());//第n个新元素是前n个旧元素的运算总计
//1 -1 -4 -8 -13
adjacent_difference(iv.begin(), iv.end(), oite);//#1元素照录,#n新元素等于#n旧元素 - #n-1旧元素
//1 1 1 1 1
adjacent_difference(iv.begin(), iv.end(), oite, plus<int>());//#1元素照录,#n新元素等于op(#n旧元素,#n-1旧元素)
//1 3 5 7 9
getchar();
}