• 【转】STL模板之accumulate


    看到卓神的代码有这个东西,就去查了查,ORZZLD,以下为转载。

    =============================================================

    该算法在numeric头文件中定义。

    假设vec是一个int型的vector对象,下面的代码:

    1 //sum the elements in vec starting the summation with the value 42
    2 int sum = accumulate(vec.begin() , vec.end() , 42);

    将sum设置为vec的元素之和再加上42。

    accumulate带有三个形参:头两个形参指定要累加的元素范围,第三个形参则是累加的初值

    accumulate函数将它的一个内部变量设置为指定的初始值,然后在此初值上累加输入范围内所有元素的值。accumulate算法返回累加的结果,其返回类型就是其第三个实参的类型

    用于指定累加起始值的第三个参数是必要的,因为accumulate对将要累加的元素类型一无所知,除此之外,没有别的办法创建合适的起始值或者关联的类型。

    accumulate对要累加的元素类型一无所知,这个事实有两层含义。首先,调用该函数时必需传递一个初始值,否则,accumulate将不知道使用什么初始值。其次,容器内的元素类型必须与第三个实参的类型匹配,或者可转换为第三个实参的类型。在accumulate内部,第三个实参用作累加的起点;容器内的元素按顺序连续累加到综合之中。因此,必须能够将元素类型加到总和类型上。

    假定V是vector<double>类型的对象,则调用accumulate<v.begin() , v.end() , 0>是否有错?如果有的话,错在哪里?

    从函数调用上看没有错误。
    调用accumulate函数必须满足的条件包括:容器内的元素类型必须与第三个实参的类型匹配,或者可转换为第三个实参的类型。上述调用中的第三个实参为int类型,而vector对象中的元素的类型为double类型,可以转换为int类型。

    但计算的结果不准确。因为将double类型转换为int类型会截去小数部分,得到的求和结果是各元素的整数部分的和,是一个int类型的值,与实际的元素值总和相比会有比较大的误差。

    考虑下面的例子,可以使用accumulate把string型的vector容器中的元素连接起来.

    1 //concatenate elements from V and store in sum
    2 string sum = accumulate(v.begin() , v.end() , string(" "));

    这个函数调用的效果是:从空字符串开始,把vec里的每个元素连接成一个字符串。

  • 相关阅读:
    收集的java面试题
    重载和重写的区别
    java中封装的概念
    java中多态的概念
    vue中的$on,$emit,$once,$off源码实现
    js bind的实现
    对象的深拷贝
    v-for的简单实现
    v-for的显示过滤/排序结果
    ES6的数组方法之Array.from
  • 原文地址:https://www.cnblogs.com/TonyNeal/p/stlaccumulate.html
Copyright © 2020-2023  润新知