文档章节

std::accumulate 的2种用法

刘大神
 刘大神
发布于 2016/06/30 16:14
字数 489
阅读 653
收藏 1

    accumulate是一种定义在<numeric>头文件里面的一个关于计算范围内元素和的算法。而这个求和的方式有2种:一种是重载,operator +;另外一种是通过二元函数去求和。下面是2种方法的定义:

template<class _InIt,class _Ty> inline
_Ty accumulate(_InIt _First,_InIt _Last, _Ty _Val);

template<class _InIt, class _Ty, class _Fn2> inline
_Ty _Accumulate(_InIt _First, _InIt _Last, _Ty _Val, _Fn2 _Func);

    参数说明:

            _First,_Last    表示需求和的元素的范围(此参数类型为迭代器类型,必须要满足迭代器特性)

            _Val              表示和的初始值,可为0

            _Func            被使用的二元函数对象。   

   两种方式的函数可能实现:

template<class _InIt,class _Ty> inline
_Ty accumulate(_InIt _First, _InIt _Last, _Ty _Val)
{    // return sum of _Val and all in [_First, _Last)
    return (_STD accumulate(_First, _Last, _Val, plus<>()));
}



template<class _InIt,class _Ty,class _Fn2> inline
_Ty _Accumulate(_InIt _First, _InIt _Last, _Ty _Val, _Fn2 _Func)
{    // return sum of _Val and all in [_First, _Last), using _Func
    for (; _First != _Last; ++_First)
        _Val = _Func(_Val, *_First);
    return (_Val);
}

这中间有个小插曲,就是 第一种实现用了std::plus 这个模版结构体(注意:plus是模版结构体)。这个模版算法比较有意思,顾名思义,这是一个功能为“相加”的算法,等同于 “operator +”。std::plus的实现如下:

template<>
struct plus<void>
{    // transparent functor for operator+
    template<class _Ty1,class _Ty2>
    auto operator()(_Ty1&& _Left, _Ty2&& _Right) const
    -> decltype(static_cast<_Ty1&&>(_Left)
        + static_cast<_Ty2&&>(_Right))
    {    // transparently apply operator+ to operands
        return (static_cast<_Ty1&&>(_Left)
            + static_cast<_Ty2&&>(_Right));
    }
};

纵观这个结构体,有个很特殊的关键字 decltype;在c++种 这个关键字是用来做推导算法的,在这里,这个结构体是通过推导参数的类型进行计算的。所以,重点来了:

std::accumulate 这个被用作计算的模版算法,不仅仅可以用作“数学意义”上的计算,还可以用来计算 字符串string等数据结构(此数据结构必须有迭代器)。这一点往往会被忽略。

© 著作权归作者所有

刘大神
粉丝 8
博文 21
码字总数 18133
作品 0
朝阳
高级程序员
私信 提问
加载中

评论(2)

刘大神
刘大神 博主

引用来自“zhji09”的评论

为什么还要static_cast?
今天偶尔又看到了这篇博客,重新回答下这个问题!
static_cast的作用是将右值引用转换成特定类型
z
zhji09
为什么还要static_cast?
使用 C++ 的 StringBuilder 提升 4350% 的性能

原文出处:Pablo Aliskevicius 译文出处:monkee,2013-09-11 介绍 经常出现客户端打电话抱怨说:你们的程序慢如蜗牛。你开始检查可能的疑点:文件IO,数据库访问速度,甚至查看web服务。 但...

Pablo Aliskevicius
2017/01/06
0
0
使用 C++ 的 StringBuilder 提升 4350% 的性能

介绍 经常出现客户端打电话抱怨说:你们的程序慢如蜗牛。你开始检查可能的疑点:文件IO,数据库访问速度,甚至查看web服务。 但是这些可能的疑点都很正常,一点问题都没有。 你使用最顺手的性...

oschina
2013/09/07
18.3K
49
boost::bind的使用方法

bind - boost 头文件: boost/bind.hpp bind 是一组重载的函数模板. 用来向一个函数(或函数对象)绑定某些参数. bind的返回值是一个函数对象. 它的源文件太长了. 看不下去. 这里只记下它的用法...

临峰不畏
2013/03/18
0
0
boost:bind使用指南

bind - boost 头文件: boost/bind.hpp bind 是一组重载的函数模板. 用来向一个函数(或函数对象)绑定 某些参数. bind的返回值是一个函数对象. 它的源文件太长了. 看不下去. 这里只记下它的用法...

follitude
2016/08/04
8
0
find_if 仿函数的使用

有时我们要在map、vector容器中查找符合条件的记录,map提供一个find的成员函数,但也仅限于查找关键字满足条件的记录,不支持值域的比较。如果我们要在值域中查找记录,该函数就无能无力了。...

长平狐
2012/11/01
299
0

没有更多内容

加载失败,请刷新页面

加载更多

IT兄弟连 Java语法教程 数组 数组的声明

Java语言支持两种语法格式来定义数组: type[] arrayName; type arrayName[]; 对这两种语法格式而言,通常推荐使用第一种格式,因为第一种格式不仅具有更好的语义,而且具有更好的可读性。对...

老码农的一亩三分地
31分钟前
3
0
OSChina 周三乱弹 —— 公司俩美女离职了

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @无形的肖申克 :分享広橋真紀子的单曲《時には昔の話を》: 《時には昔の話を》- 広橋真紀子 手机党少年们想听歌,请使劲儿戳(这里) @小橙子...

小小编辑
今天
2.2K
18
内存池和tcmalloc的性能比较

最近在测试tcmalloc性能的时候发现了一个现象!!!!就是new似乎很消耗性能!!直接上代码! #include "time.h" #include <gperftools/tcmalloc.h> using namespace std; #define MAX_SIZE......

shzwork
今天
6
0
Protocol Buffers 简介

文档编辑和持续集成状态: 本文档的 Protocol Buffer 的中文文档使用的是 Asciidoctor 进行编排的 http://docs.ossez.com/protocol-buffers-docs/index.html(本 WIKI 中的内容将会与在线发布...

honeymoose
今天
6
0
uniapp + bootstrapvue 移动/PC 一套搞定 (一)配置bootstrapvue

1.准备文件 自己到DCloud官网: http://dcloud.io/ 去下载官方的IDE Hbuilder,新建一个空的uniapp项目即可。 uniapp框架自带优化的vue,我们仅仅需要准备以下三个文件: bootstrap.min.css ...

panyunxing
今天
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部