C++的STL中accumulate函数的使用方法

目录
  • 1.累加求和
  • 2.自定义数据类型的处理
  • 3.用法

前言:

accumulate定义在#include中,作用有两个,一个是累加求和,另一个是自定义类型数据的处理

1.累加求和

int sum = accumulate(vec.begin() , vec.end() , 42);

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

可以使用accumulate把string型的vector容器中的元素连接起来:

string sum = accumulate(v.begin() , v.end() , string(" "));

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

2.自定义数据类型的处理

C++ STL中有一个通用的数值类型计算函数— accumulate(),可以用来直接计算数组或者容器中C++内置数据类型,

例如:

#include <numeric>
int arr[]={10,20,30,40,50};
vector<int> va(&arr[0],&arr[5]);
int sum=accumulate(va.begin(),va.end(),0);  //sum = 150

是对于自定义数据类型,我们就需要自己动手写一个回调函数来实现自定义数据的处理,然后让它作为accumulate()的第四个参数,accumulate()的原型为

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);
    }

例如:

#include <vector>
#include <string>
using namespace std;
 
struct Grade
{
    string name;
    int grade;
};
 
int main()
{
    Grade subject[3] = {
        { "English", 80 },
        { "Biology", 70 },
        { "History", 90 }
    };
 
    int sum = accumulate(subject, subject + 3, 0, [](int a, Grade b){return a + b.grade; });//a值是前面计算的中间结果 看前面的原型模板定义~ a 就是 _Val
    cout << sum << endl;
 
    system("pause");
    return 0;
}

3.用法

我们在必要时可以定义自己的加法运算。

例如:

​​​​​​​std::vector<int> values {2, 0, 12, 3, 5, 0, 2, 7, 0, 8};
int min {3};
auto sum = std::accumulate(std::begin(values), std::end(values), 0, [min] (int sum, int v)
{
    if(v < min)
        return sum;
    return sum + v;
});
std::cout << "The sum of the elements greater than " << min-1<<"is " << sum << std::endl;  // 35

这里忽略了值小于 3 的元素。这个条件可以尽可能复杂,因此,我们能够求出指定范围内的元素之和。这个运算并不一定要是加法,可以是任何不修改操作数或不使定义范围的迭代器无效的运算。例如,为数值元素定义的乘法运算函数会生成元素的乘积,只要初值为 1。实现浮点元素除法的函数会生成元素乘积的倒数,只要初值为 1。

下面展示了如何生成元素的乘积:

std::vector<int> values {2, 3, 5, 7, 11, 13};
auto product = std::accumulate(std::begin(values), std::end(values), 1, std::multiplies<int>()); // 30030

这里用来自于 functional 头文件的函数作为第 4 个参数。如果有值为 0 的元素,可以像上一个代码段中的 lambda 表达式那样忽略它们。

string 类支持加法,因此可以将 accumulate() 应用到 string 对象的序列上:

std:: vector<string> numbers {"one", "two", "three", "four", "five","six", "seven","eight", "nine","ten"};
auto s = std::accumulate(std::begin(numbers), std::end(numbers), string{},[](strings str, string& element)
{
    if (element[0] == 't')
        return str +' '+ element;
    return str;
}); // Result: " two three ten"

这段代码连接了以开头的 string 对象,并用空格将它们隔开。

acumulate() 算法得到的结果可能和它所应用的序列中的元素类型不同:

std::vector<int> numbers {1, 2, 3, 10, 11, 12};
auto s = std::accumulate(std::begin(numbers), std::end(numbers),string {"The numbers are"},[](strings str, int n){ return str + " : " + std::to_string(n);});
std::cout << s << std::endl;//Output: The numbers are: 1: 2: 3: 10: 11: 12

lambda 表达式使用的 to_string() 函数会返回一个数值参数的 string 形式,所以应用 accumulate() 到这里的整数序列会返回注释中显示的 string。

到此这篇关于C++的STL中accumulate函数的使用方法的文章就介绍到这了,更多相关C++的STL中accumulate内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • c++基础使用STL的注意点详解

    总结 本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

  • C++中模板和STL介绍详解

    目录 一.模板 1.1.函数模板 1.1.1.两种函数模板的实例化 1.1.2.模板参数的匹配原则 1.2.类模板 二.STL 总结 一.模板 对于一个交换函数,虽然C++支持函数重载,我们可以对多个交换函数起相同的名字: void Swap(int& left, int& right) { int temp = left; left = right; right = temp; } void Swap(double& left, double& right) { doub

  • c++中STL库队列详细介绍

    1.queue单向队列(先进先出,只能从尾端加元素,从头删元素)         使用方式:在前面加上文件名'#include<queue>',再进行声明'queue<int>m;''其中'<>'里面是数组的类型,'m'是数组的名字.         操作: 1.q.push()//入队 2.q.pop()//让队首出队 3.q.front()//获得队首元素 4.q.back()//获得队尾元素         5.q.empty() 队列是否为空 6.q.size(

  • 详解C++ 的STL迭代器原理和实现

    1. 迭代器简介 为了提高C++编程的效率,STL(Standard Template Library)中提供了许多容器,包括vector.list.map.set等.然而有些容器(vector)可以通过下标索引的方式访问容器里面的数据,但是大部分的容器(list.map.set)不能使用这种方式访问容器中的元素.为了统一访问不同容器时的访问方式,STL为每种容器在实现的时候设计了一个内嵌的iterator类,不同的容器有自己专属的迭代器(专属迭代器负责实现对应容器访问元素的具体细节),使用迭代

  • C++的STL中accumulate函数的使用方法

    目录 1.累加求和 2.自定义数据类型的处理 3.用法 前言: accumulate定义在#include中,作用有两个,一个是累加求和,另一个是自定义类型数据的处理 1.累加求和 int sum = accumulate(vec.begin() , vec.end() , 42); accumulate带有三个形参:头两个形参指定要累加的元素范围,第三个形参则是累加的初值.accumulate函数将它的一个内部变量设置为指定的初始值,然后在此初值上累加输入范围内所有元素的值.accumulat

  • oracle中decode函数的使用方法示例

    decode的几种用法 1:使用decode判断字符串是否一样 DECODE(value,if1,then1,if2,then2,if3,then3,...,else) 含义为 IF 条件=值1 THEN RETURN(value 1) ELSIF 条件=值2 THEN RETURN(value 2) ...... ELSIF 条件=值n THEN RETURN(value 3) ELSE RETURN(default) END IF sql测试 select empno,decode(empn

  • ThinkPHP自动完成中使用函数与回调方法实例

    本文实例讲述了ThinkPHP自动完成中使用函数与回调方法.分享给大家供大家参考.具体方法如下: ThinkPHP 自动填充格式如下: 复制代码 代码如下: array(填充字段,填充内容[,填充条件][,附加规则]) 附加规则,可选,包括: string:字符串,表示填充内容为字符串(默认). function:使用函数,表示填充的内容是一个函数返回值. callback:使用方法,表示填充的内容是一个当前 Model 的方法返回值. field:字段,表示填充的内容是一个其他字段的值. Th

  • php实现excel中rank函数功能的方法

    本文实例讲述了php实现excel中rank函数功能的方法.分享给大家供大家参考.具体分析如下: sql语句实现排名是像这样的如: 总分成绩为 195,180,180,161,名次分别为1,2,3,4,遇到并列的情况也是按照顺序的, 而Excel函数rank排名得到的结果是1,2,2,4,遇到并列跳过中间的3 下面的函数模拟的就是这种情况 函数如下(不知道有没有更好的实现方法): 公式为: 名次=总人数--比自己小的数的个数-这个分数重复次数+1(加上自己) 得到名次的数组再根据对应的id写入到

  • C++中strstr函数的实现方法总结

    C++中strstr函数的实现方法总结 函数说明: 包含文件:string.h 函数名: strstr 函数原型:extern char *strstr(char *str1, char *str2); 功能:从字符串str1中查找是否有字符串str2, 如果有,从str1中的str2位置起,返回str1的指针,如果没有,返回null. 返回值:返回该位置的指针,如找不到,返回空指针. 方法一: #include <iostream> #include <assert.h> usi

  • 浅谈MySQL中group_concat()函数的排序方法

    group_concat()函数的参数是可以直接使用order by排序的.666.. 下面通过例子来说明,首先看下面的t1表. 比如,我们要查看每个人的多个分数,将该人对应的多个分数显示在一起,分数要从高到底排序. 可以这样写: SELECT username,GROUP_CONCAT(score ORDER BY score DESC) AS myScore FROM t1 GROUP BY username; 效果如下: 以上这篇浅谈MySQL中group_concat()函数的排序方法就

  • php中array_column函数简单实现方法

    本文实例讲述了php中array_column函数简单实现方法.分享给大家供大家参考,具体如下: php中的array_column()可返回输入数组中某个单一列的值. 示例: <?php // 从数据库中返回数组: $a = array( array( 'id' => 0015, 'age' => '20', 'name' => 'Tom', ), array( 'id' => 0016, 'age' => '21', 'name' => 'Jack', ),

  • PHP中error_log()函数的使用方法

    本文实例讲述了PHP中error_log()函数的使用方法.分享给大家供大家参考.具体分析如下: 今天遇到一个问题需要调试,但是只能通过日志打印调试,就用到了error_log这个函数 需要打印的是一台服务器发送到我们服务器的post数据 代码如下:(key和value都打印了) 复制代码 代码如下: if(!empty($_POST) ){  while (list($key, $val) = each($_POST))   {  @error_log("$key => $val&quo

  • 详解Django中 render() 函数的使用方法

    render() 函数 在讲 render() 函数之前,我们在 Django 项目 index 文件夹的 urls.py 和 views.py 中编写如下功能代码:(不难,望读者细心阅之) # index的 urls.py from django.urls import path form . import views urlpatterns = [ # 定义首页的路由 path(' ', views.index, name='index'), ] # index的views.py from

  • python中leastsq函数的使用方法

    leastsq作用:最小化一组方程的平方和. 参数设置: func 误差函数 x0 初始化的参数 args 其他的额外参数 举个例子: 首先创建样本点 import numpy as np import scipy as sp from scipy.optimize import leastsq import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode

随机推荐