STL algorithm (1) : numeric part

原创 2006年05月28日 10:51:00

STL algorithm (1) : numeric part
includes functions: accumulate, partial_sum, adjacent_difference, inner_product

1. accumulate

用途: 对于序列 X[n], 计算其中某个区段[first, last) 的统计特性.

具体来说对于计算 ∑fun(Xi)   i∈[first, lase) 很有用。

例如:X[n] = {1, 2, 3, 4, 5};

我们需要计算  ∑(3Xi2-5Xi+10)  i∈[1, 5]

我们这样写代码:

//代码经过vc6.0 调试, 使用SGI-STL3.0 (此版本代码可阅读性比较好,侯先生的<<STL源码剖析>>就是用的此版 本)

#include <numeric>
#include<iostream.h>

template<class T>
struct myFun
{

 T operator()(const T& x, const T& y)const
 { return x + 3*y*y -5*y+10; }
};

using namespace  std;
void main()
{
 int data[5] = {1, 2, 3, 4, 5};
 cout<< accumulate(data, data+5, 0, myFun<int>())<<endl; //140
}

函数声名如下:

template <class InputIterator, class T>
T accumulate(InputIterator first, InputIterator last, T init);

template <class InputIterator, class T, class BinaryFunction>
T accumulate(InputIterator first, InputIterator last, T init,
             BinaryFunction binary_op);

 2.partial_sum 部分和

用途: 对于序列 X[n], 计算其中区段[first, last) 中逐个位置的累积特性.

该函数和 accumulate 有相似之处在于都是计算累积特性, 但是 accumulate 函数只有一个返回值, 而partial_sum 可以计算逐个位置的累积特性也。

例如:X[n] = {1, 2, 3, 4, 5};

我们需要计算5个值:

∑(3Xi2-5Xi+10)  i∈[1, k] , k ∈[1, 5]

我们这样写代码:

#include <numeric>
#include<iostream>
#include <algorithm>

template<class T>
struct myFun
{

 T operator()(const T& x, const T& y)const
 { return x + 3*y*y -5*y+10; }
};

using namespace  std;
void main()
{
 int data[5] = {1, 2, 3, 4, 5};
 partial_sum (data, data+5, data, myFun<int>());
 copy (data, data+5, ostream_iterator<int>(cout, "* "));  //1* 13* 35* 73* 133*
 cout<<endl;
}

函数声名如下:

template <class InputIterator, class OutputIterator>
OutputIterator partial_sum(InputIterator first, InputIterator last,
                           OutputIterator result);

template <class InputIterator, class OutputIterator, class BinaryOperation>
OutputIterator partial_sum(InputIterator first, InputIterator last,
                           OutputIterator result, BinaryOperation binary_op);

 3. adjacent_difference 相邻差

用途: 对于序列 X[n], 计算区段[first, last) 中相邻位置相关的特性.

该函数和 partial_sum 为互逆运算(两个函数的第一个声明)

例如:X[n] = {1, 2, 3, 4, 5};

我们需要计算:

       yi =xi2-5xi-1+10 ,    ( i∈[2, 5] , y1=x1)

我们这样写代码:

#include <numeric>
#include<iostream>
#include <algorithm>

template<class T>
struct myFun
{
 T operator()(const T& x, const T& y)const
 { return x*x - 5*y + 10; }
};

using namespace  std;
void main()
{
 int data[5] = {1, 2, 3, 4, 5};
 adjacent_difference (data, data+5, data, myFun<int>());
 copy (data, data+5, ostream_iterator<int>(cout, "* "));  //1* 9* 9* 11* 15*
 cout<<endl;
}
函数声名如下:

template <class InputIterator, class OutputIterator>
OutputIterator adjacent_difference(InputIterator first, InputIterator last, 
                                   OutputIterator result);

template <class InputIterator, class OutputIterator, class BinaryFunction>
OutputIterator adjacent_difference(InputIterator first, InputIterator last,
                                   OutputIterator result,
                                   BinaryFunction binary_op);

4.inner_product 内积

 用途: 计算两个序列的统计特性。

例如:

X[n] = {1, 2, 3, 4, 5};

Y[n] = {5, 4, 3, 2 ,1};

我们需要计算:

       ∑(xi2-5Yi+10 ),    ( i∈[1, 5] )

我们这样写代码:

#include <numeric>
#include<iostream>
#include <algorithm>

template<class T>
struct myFun
{
 T operator()(const T& x, const T& y)const
 { return x*x - 5*y + 10; }
};

using namespace  std;
void main()
{
 int x[5] = {1, 2, 3, 4, 5};
 int y[5] = {5, 4, 3, 2 ,1};
 cout<<inner_product (x, x+5, y, 0, plus<int>(),myFun<int>()) //30
  <<endl;
}

简单小结如下:

1.  accumulate , inner_product 计算序列的一个统计特性数据;

     partial_sum, adjacent_difference 计算已知序列的若干特性。

2。partial_sum, adjacent_difference 中的 result 可以是 beging

3。pattial_sum , adjacent_difference 的第一个模板函数互逆

ACM竞赛常用STL(二)之STL--algorithm

无疑是STL 中最大的一个头文件,它是由一大堆模板函数组成的。 下面列举出中的模板函数: adjacent_find / binary_search / copy / copy_backward ...
  • xindoo
  • xindoo
  • 2013年04月04日 20:27
  • 1794

STL algorithm中的swap 函数使用

对自定义类型使用STL algorithm中的swap函数, 会调用自定义的类型的拷贝构造函数一次,赋值函数两次;自定义类型中没有定义那么就会使用默认的拷贝构造函数和赋值函数。  如果是容器,那么会...
  • Blues1021
  • Blues1021
  • 2015年08月15日 17:58
  • 2368

STL Algorithm的介绍(1)

原文地址:http://www.cplusplus.com/reference/algorithm/ library Standard Template Library: ...
  • guang_jing
  • guang_jing
  • 2014年08月19日 23:11
  • 938

用STL给C++充电:Part 1

Power up C++ with the Standard Template Library: Part I 作者:DmitryKorolev TopCoder成员 原文地址: http://com...
  • guodongxiaren
  • guodongxiaren
  • 2013年06月09日 23:00
  • 2358

关于leetcode中c++ STL 的几道题

1. Valid Parentheses 用来判断字符串中的括号是否合法的一道题。注意输入只会有 (, ) , {, }, [, ]这么几种情况。 合法的括号是以一定的顺序进行匹配的一些。比如:"()...
  • u011321908
  • u011321908
  • 2015年04月20日 10:47
  • 1049

STL vector用法介绍+ STL 常用函数用法

介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作。本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用。...
  • hhu1506010220
  • hhu1506010220
  • 2016年07月20日 20:23
  • 719

C++ STL算法系列3---求和:accumulate

该算法在numeric头文件中定义。 假设vec是一个int型的vector对象,下面的代码: //sum the elements in vec starting the summation...
  • hyg0811
  • hyg0811
  • 2013年08月30日 15:08
  • 7376

c++ algorithm中常用的几个内置函数

#include #include #include using namespace std; void print(int &elem){ cout } //qsprt必须用这种格式定义比较...
  • yo_bc
  • yo_bc
  • 2016年11月25日 17:41
  • 735

numeric(m,n)所能插入数值的范围

最近看书的时候看到这么一句话: 对于声明了精度的数值,如果insert插入的数值大于声明的精度范围,则会报错。 那么这里的精度范围是什么?精度代表的数值就是位数吗?即3是不是意味着最大值就是9...
  • Oraclesand
  • Oraclesand
  • 2017年02月08日 09:14
  • 1678

【STL】algorithm算法介绍

STL算法部分主要由头文件,,组成。要使用 STL中的算法函数必须包含头文件,对于数值算法须包含,中则定义了一些模板类,用来声明函数对象。     STL中算法大致分为四类:         1、...
  • Fate_Dream
  • Fate_Dream
  • 2016年12月26日 10:00
  • 333
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STL algorithm (1) : numeric part
举报原因:
原因补充:

(最多只允许输入30个字)