accumulate

template <class InputIterator,class T>
T accumulate(InputIterator first, InputIterator last, T init)
{
for (; first != last; first++)
{
init = init + *first;
}
return init;
} template <class InputIterator,class T,class BinaryOperation>
T accumulate(InputIterator first, InputIterator last, T init, BinaryOperation binary_op)
{
for (; first != last; first++)
{
init = binary_op(init, *first);
}
return init;
}
  1. 一定要提供一个init这样明确的初始值,这样因为在[first.last)中为空时,仍然有明确的定义
  2. 双参操作符不一定具有交换性和结合性,因为所有的accumulate操作都有明确的定义,先初始化init操作,然后对[first,last)中的每一个iterator i,从头到尾执行result=result+*i,或result=binary_op(result,*i),也就是先用init和[first,last)中的*first做运算,在用得到的结果和[first,last)中剩余的每个元素做运算
  3. 二元仿函数不必满足交换律和结合律
#include <iostream>
#include <numeric>
#include <vector>
#include <functional>
using namespace std; class F
{
public:
int operator()(int i,int j)
{
return i-j;
}
};
int main()
{
vector<int> v{,,};
int t=accumulate(v.begin(),v.end(),,multiplies<int>());
cout<<"t:"<<t<<endl; int t1=accumulate(v.begin(),v.end(),,F());
cout<<"t1:"<<t1<<endl; return ;
}

inner_product

template <class InputIterator1, class InputIterator2, class T>
T inner_product(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, T init)
{
// 以第一序列为依据,将两个序列都走一遍
for (; first1 != last1; ++first1, ++first2)
{
init = init + (*first1 * *first2); //执行两个序列的一般内积
}
return init;
} template <class InputIterator1, class InputIterator2,
class BinaryOperation1, class BinaryOperation2, class T>
T inner_product(InputIterator1 first1, InputIterator1 last1,InputIterator2 first2, T init,
BinaryOperation1 binary_op1, BinaryOperation2 binary_op2)
{
for (; first1 != last1; ++first1, ++first2)
{
init = binary_op1(init, binary_op2(*first1, *first2)); //执行两个序列的一般内积
}
return init;
}
  1. 计算[first1,last1)和[first2,last2+(last1-first1))的一般化内积,如果要计算两个vector的一般化内积,把init置为0
  2. 第一个版本先执行result=init,然后执行result=result+(*i)*(first2+(i-first1))
  3. 第二个版本先执行result=init,再执行binary_op2(*i,*(first2+(i-first1)),然后执行binary_op1(result,binary_op2(*i,*(first2+(i-first1))),依次循环...
  4. 二元仿函数不必满足交换律和结合律
#include <iostream>
#include <numeric>
#include <vector>
#include <functional>
using namespace std; class F1
{
public:
int operator()(int i,int j)
{
//clog<<" 执行F1"<<endl;
return i+j;
}
};
class F2
{
public:
int operator()(int i,int j)
{
//clog<<" 执行F2"<<endl;
return i/j;
}
};
int main()
{
vector<int> v{,,};
vector<int> v1{,,,,,}; int t=inner_product(v.begin(),v.end(),v1.begin(),);
cout<<"t:"<<t<<endl; int t1=inner_product(v.begin(),v.end(),v1.begin(),,F1(),F2());
cout<<"t1:"<<t1<<endl;
return ;
}

parital_sum

  计算部分总和,先将*first赋值result,再将*first和*(first+1)赋值给*(result+1)等等,result可以等于first,次函数与adjacent_difference,返回值指向输出算法的尾区间:result+(last-first)

template <class InputIterator, class OutputIterator>
OutputIterator partial_sum(InputIterator first, InputIterator last, OutputIterator result)
{
if (first == last)
{
return result; // 区间内容为空直接返回result
}
*result = *first; // 首先记录第一个元素(即原容器中第一个元素内容不变)
iterator_traits<InputIterator>::value_type value = *first;
while (++first != last) // 之后的元素为本位置+前一个位置的值
{
value = value + *first;
*++result = value;
}
return ++result;
} template <class InputIterator, class OutputIterator, class BinaryOperation>
OutputIterator partial_sum(InputIterator first, InputIterator last,
OutputIterator result, BinaryOperation binary_op)
{
if (first == last)
{
return result; // 区间内容为空直接返回result
}
*result = *first; // 首先记录第一个元素(即原容器中第一个元素内容不变)
iterator_traits<InputIterator>::value_type value = *first;
while (++first != last)
{
value = binary_op(value, *first);
*++result = value;
}
return ++result;
}

adjacent_difference

  1. 如果result==first,可以就地计算元素的差,储存第一元素的值可以重建输入区间的内容
  2. 先将*first赋值给*result,对于[first+1,last)中的每个iterator i,第一版本(重载operator -)将*i与*(i-1)之差赋值给*(result+(i-first)),第二版本(自己重定义函数对象)是binary(*i,*(i-1))赋值给*(result+(i-first))
template <class InputIterator, class OutputIterator>
OutputIterator adjacent_difference(InputIterator first, InputIterator last, OutputIterator result)
{
if (first == last)
{
return result; // 区间内容为空直接返回result
}
*result = *first; // 首先记录第一个元素(即原容器中第一个元素内容不变)
//return __adjacent_difference(firsts,last,result,value_tyope(first));
iterator_traits<InputIterator>::value_type value = *first;
while (++first != last) // 之后的元素为本位置-前一个位置的值
{//__adjacent_difference的内容
T tmp = *first;
*++first = tmp - value;
value = tmp;
}
return ++result;
} template <class InputIterator, class OutputIterator, class BinaryOperation>
OutputIterator adjacent_difference(InputIterator first, InputIterator last,
OutputIterator result, BinaryOperation binary_op)
{
if (first == last)
{
return result; // 区间内容为空直接返回result
}
*result = *first; // 首先记录第一个元素(即原容器中第一个元素内容不变)
iterator_traits<InputIterator>::value_type value = *first;
while (++first != last)
{
T tmp = *first;
*++first = binary_op(tmp, value);
value = tmp;
}
return ++result;
}

power

template <class T, class Integer>
inline T power(T x, Integer n)
{
return power(x,n,multiplies<T>()); // multiplies<T>()是一个仿函数的临时对象,意为相乘
} // 版本2,如果指定为乘方运算,则当n >= 0时返回x^n
// MonoidOperation必须满足结合律,可不满足交换律
template <class T, class Integer, class MonoidOperation op>
T power(T x, Integer n, MonoidOperation op)
{
if (n == ) // 直接返回1也行
{
return identity_element(op); // 取出证同元素
}
else // 过滤低位的0
{
while ((n & ) == )
{
n >>= ; // n右移一位
x = op(x, x); // x = x op x;
} }
T result = x;
n >>= ;
while (n != )
{
x = op(x, x);
if ((n & ) != )
{
result = op(result, x);
}
n >>= ;
}
return result;
}

itoa

template <class ForwardIterator, class T>
void iota(ForwardIterator first, ForwardIterator last, T value)
{
while (first != last)
{
*first = value++;
}
}

  

一般化数值算法(accumluate,inner_product,partial_sum,adjacent_difference)的更多相关文章

  1. STL--STL和她的小伙伴们:

    STL--概述: 标准模板库(StandardTemplateLibrary,STL),是C++程序设计语言标准模板库.STL是由Alexander Stepanov.Meng Lee和David R ...

  2. C++ 容器一些细节

    今天学习是看到了讲解C++容器的一些细节用法,故记之!参考:http://www.cnblogs.com/answeryi/archive/2011/12/16/2289811.html: 目录 == ...

  3. C++ 容器及选用总结

    目录 ==================================================== 第一章 容器 第二章 Vector和string 第三章 关联容器 第四章 迭代器 第五 ...

  4. ###《Effective STL》--Chapter7

    点击查看Evernote原文. #@author: gr #@date: 2014-08-31 #@email: forgerui@gmail.com Chapter7 在程序中使用STL Topic ...

  5. c++容器使用总结(转载)

    目录 ==================================================== 第一章 容器 第二章 Vector和string 第三章 关联容器 第四章 迭代器 第五 ...

  6. Sword STL容器分类介绍

    标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器slist和rope.slist是一个单 ...

  7. (转)C++ 容器及选用总结

    目录 ==================================================== 第一章 容器 第二章 Vector和string 第三章 关联容器 第四章 迭代器 第五 ...

  8. 学习笔记:STL

    第一部分:(参考百度百科) 一.STL简介 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.它是由Alexander Stepanov.Me ...

  9. 《Effective STL》学习笔记

    http://www.cnblogs.com/arthurliu/archive/2011/08/07/2108386.html 作者:咆哮的马甲 出处:http://www.cnblogs.com/ ...

随机推荐

  1. mysql存储过程造数

    性能测试时,数据库表通常需要很多数据,此时我们可以用存储过程来造数,以下代码mysql.Oracle都可以用 首先,先查看数据库表的设计,可以看到每张表有多少字段,分别都是什么类型,哪个字段是自动增长 ...

  2. AngularJS2.0教程(一)快速上手之基础知识

    Why Angular2 Angular1.x显然非常成功,那么,为什么要剧烈地转向Angular2? 性能的限制 AngularJS当初是提供给设计人员用来快速构建HTML表单的一个内部工具.随着时 ...

  3. YLZ开发后端外网编写

    如何取得前端的值并做处理 // 调用ESB来获取Ajaxpagerespon获得审核记录 @RequestMapping(value = "/queryBydwId", metho ...

  4. Oracle hint手动优化

    例子 select/*+FULL(fortest)*/ * from fortest where id = 2000000 //使用0.70s时间 select* from fortest where ...

  5. day 46 前端基础 基本框架

    注意一点 使用绝对路径的时候 在pxm里 打开显示不了图片 可以直接找到那个实际的网页去打开 还可能是图片的格式尽量用jpg一 详细解释 <!DOCTYPE html>声明为HTML5文档 ...

  6. Strict Standards: Declaration of UserModel::toJSON() should be compatible with that of BaseModel::toJSON()

    使用php报了这个错误: 错误的意思是:  严格标准: usermodel中的 toJSON() 方法 应该 同 BaseModel中的toJson() 方法是兼容的. php要求 子类的方法如果同父 ...

  7. array_udiff_uassoc

    PHP array_udiff_uassoc 函数 一.函数功能: 计算出第一个数组与其他数组的差集(考虑键名和键值,对键名和键值的比较都使用自定义函数).比较两到多个数组,找出第一个数组中不包含在其 ...

  8. django面试五

    http和https的区别https协议需要到ca申请证书,一般免费证书很少,需要交费. 注:CA - certificate authority,身份认证,权威机构认证,CA认证: http是超文本 ...

  9. python 常用的高阶函数

    前言 高阶函数指的是能接收函数作为参数的函数或类:python中有一些内置的高阶函数,在某些场合使用可以提高代码的效率. map() map函数可以把一个迭代对象转换成另一个可迭代对象,不过在pyth ...

  10. 排序(N+1种)

    from large to small 选择排序: 算法描述: 输入a[n] a[1]~a[n] a[2]~a[n]          a[i]~a[n] 找最小的,与a[1]交换 找最小的,与a[2 ...