C++11标准模板(STL)- 算法(std::accumulate)

news2025/4/7 6:08:51
定义于头文件 <algorithm>

算法库提供大量用途的函数(例如查找、排序、计数、操作),它们在元素范围上操作。注意范围定义为 [first, last) ,其中 last 指代要查询或修改的最后元素的后一个元素。

对一个范围内的元素求和

std::accumulate

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

(1)
template< class InputIt, class T, class BinaryOperation >

T accumulate( InputIt first, InputIt last, T init,

              BinaryOperation op );
(2)

 

计算给定值 init 与给定范围 [first, last) 中元素的和。第一版本用 operator+ ,第二版本用二元函数 op 求和元素,均将 std::move 应用到其左侧运算数 (C++20 起)。

op 必须无副效应。

(C++11 前)

op 必须不非法化涉及范围的任何迭代器,含尾迭代器,且不修改其所涉及范围的任何元素及 *last

(C++11 起)

参数

first, last-要求和的元素范围
init-和的初值
op-被使用的二元函数对象。接收当前积累值 a (初始化为 init )和当前元素 b 的二元运算符。

该函数的签名应当等价于:

 Ret fun(const Type1 &a, const Type2 &b);

签名中并不需要有 const &。
类型 Type1 必须使得 T 类型的对象能隐式转换到 Type1 。类型 Type2 必须使得 InputIt 类型的对象能在解引用后隐式转换到 Type2 。 类型 Ret 必须使得 T 类型对象能被赋 Ret 类型值。 ​

类型要求
- InputIt 必须满足遗留输入迭代器 (LegacyInputIterator) 的要求。
- T 必须满足可复制赋值 (CopyAssignable) 和 可复制构造 (CopyConstructible) 的要求。

返回值

1) 给定值与给定范围中的元素的和。

2) 给定范围在 op 上左折叠的结果

注意

std::accumulate 进行左折叠。为进行右折叠,必须逆转二元运算符的参数顺序,并使用逆序迭代器。

可能的实现

版本一

template<class InputIt, class T>
T accumulate(InputIt first, InputIt last, T init)
{
    for (; first != last; ++first) {
        init = std::move(init) + *first; // C++20 起有 std::move
    }
    return init;
}

版本二

template<class InputIt, class T, class BinaryOperation>
T accumulate(InputIt first, InputIt last, T init, 
             BinaryOperation op)
{
    for (; first != last; ++first) {
        init = op(std::move(init), *first); // C++20 起有 std::move
    }
    return init;
}

调用示例

#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
#include <list>
#include <iterator>
#include <time.h>

using namespace std;

struct Cell
{
    int x;
    int y;

    Cell &operator +=(const Cell &cell)
    {
        x += cell.x;
        y += cell.y;
        return *this;
    }

    Cell &operator +(const Cell &cell)
    {
        x += cell.x;
        y += cell.y;
        return *this;
    }

    Cell &operator ++()
    {
        x += 1;
        y += 1;
        return *this;
    }

    bool operator <(const Cell &cell) const
    {
        if (x == cell.x)
        {
            return y < cell.y;
        }
        else
        {
            return x < cell.x;
        }
    }

    bool operator ==(const Cell &cell) const
    {
        return x == cell.x && y == cell.y;
    }
};

std::ostream &operator<<(std::ostream &os, const Cell &cell)
{
    os << "{" << cell.x << "," << cell.y << "}";
    return os;
}

int main()
{
    std::mt19937 g{std::random_device{}()};

    srand((unsigned)time(NULL));;

    std::cout << std::boolalpha;

    std::function<Cell()> generate = []()
    {
        int n = std::rand() % 10 + 100;
        Cell cell{n, n};
        return cell;
    };

    // 初始化lCells1
    std::list<vector<Cell>> lCells1(6, vector<Cell>(5));
    //用从起始值开始连续递增的值填充一个范围
    for (vector<Cell> &vCells : lCells1)
    {
        std::generate(vCells.begin(), vCells.end(), generate);
    }

    size_t index = 0;
    for (vector<Cell> &vCells : lCells1)
    {
        std::cout << "lCells " << index << " ";
        std::copy(vCells.begin(), vCells.end(), std::ostream_iterator<Cell>(std::cout, " "));

        //计算给定值 init 与给定范围 [first, last) 中元素的和。第一版本用 operator+
        Cell accumulate = std::accumulate(vCells.begin(), vCells.end(), Cell{0, 0});
        std::cout << "  accumulate: " << accumulate << std::endl;
        index++;
    }

    std::cout << std::endl;
    std::cout << std::endl;
    std::cout << std::endl;


    auto BinaryOperation = [](const Cell & a, const Cell & b)
    {
        Cell cell{a.x + b.x, a.y + b.y};
        return cell;
    };

    // 初始化lCells2
    std::list<vector<Cell>> lCells2(6, vector<Cell>(5));
    //用从起始值开始连续递增的值填充一个范围
    for (vector<Cell> &vCells : lCells2)
    {
        std::generate(vCells.begin(), vCells.end(), generate);
    }

    index = 0;
    for (vector<Cell> &vCells : lCells2)
    {
        std::cout << "lCells " << index << " ";
        std::copy(vCells.begin(), vCells.end(), std::ostream_iterator<Cell>(std::cout, " "));
        Cell cell = generate();
        std::cout << " Tp value: " << cell;

        //计算给定值 init 与给定范围 [first, last) 中元素的和。第二版本用二元函数 op 求和元素
        Cell accumulate = std::accumulate(vCells.begin(), vCells.end(), cell, BinaryOperation);
        std::cout << "  accumulate: " << accumulate << std::endl;
        index++;
    }

    return 0;
}

输出

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/113566.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

node.js+uni计算机毕设项目基于微信小程序的大型商场一体化平台(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等…

我求求你了,GC日志打印别再瞎配置了

​ 编辑切换为居中 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 生产环境上&#xff0c;或者其他要测试 GC 问题的环境上&#xff0c;一定会配置上打印GC日志的参数&#xff0c;便于分析 GC 相关的问题。 但是可能很多人配置得都不够“完美”&#…

excel图文教程:深入了解数据分析函数FREQUENCY

1.FREQUENCY函数的作用及语法 关于这个函数的作用官方的解释是&#xff1a;以一列垂直数组返回一组数据的频率分布。 语法&#xff1a;FREQUENCY&#xff08;DATA_ARRAY&#xff0c;BINS_ARRAY&#xff09; FREQUENCY函数的第二参数可以是单元格区域&#xff0c;也可以是常量…

如何创建你自己的谷歌浏览器扩展

如果你是谷歌浏览器的用户&#xff0c;你可能已经在浏览器中使用了一些扩展。 你是否曾想过如何自己建立一个&#xff1f;在这篇文章中&#xff0c;我将向你展示如何从头开始创建一个Chrome扩展。 目录 什么是Chrome扩展&#xff1f;我们的Chrome扩展会是什么样子的&#xf…

DSP-时域中的离散信号

目录 离散时间信号的表示: 离散信号的时域表示: 序列的长度: ​编辑 信号的能量和功率: 序列的基本运算 : 相乘 (product): 相加(addition): 放大(multiplication): 时移(time-shifting): 时间反转(time-reversal): 线性卷积: 抽样率转换: 有限长序列的运算: 离散…

Wireshark 实用篇2:Wireshark 抓包常用过滤命令

目录 前言 正文 一、根据 IP 地址过滤 二、根据端口过滤 三、根据协议过滤 四、根据 Payload Type 条件过滤 五、根据组合条件过滤 六、实例分析 前言 使用 Wireshark 工具进行网络抓包属于研发人员的基础技能&#xff0c;如果你还不了解&#xff0c;建议从现在开始…

RabbitMQ 第二天 高级 7 RabbitMQ 高级特性 7.7 日志与监控

RabbitMQ 【黑马程序员RabbitMQ全套教程&#xff0c;rabbitmq消息中间件到实战】 文章目录RabbitMQ第二天 高级7 RabbitMQ 高级特性7.7 日志与监控7.7.1 RabbitMQ 日志7.7.2 web 管控台监控7.7.3 rabbitmqctl 管理和监控第二天 高级 7 RabbitMQ 高级特性 7.7 日志与监控 老师…

SpringBoot+Mybatis-Plus+Thymeleaf+Bootstrap分页页查询(前后端完整版开源学习)图书管理系统

目录分页主要逻辑&#xff0c;在3.7和3.81.准备工作1.1 参考博客1.2 项目结构2. 数据库3. 详细代码部分3.1 pom依赖3.2 application.yml3.3 BookMapper.xml3.4 BookMapper3.5 BookService 和 BookServiceImpl3.6 实体类entity book3.7控制层 BookController3.8 前端页面bookLis…

LabVIEW如何减少下一代测试系统中的硬件过时3

LabVIEW如何减少下一代测试系统中的硬件过时3 Initial System Configuration As shown in Figure 4, the test application is running on an NI PXIembedded controller with Windows XP. The PXI controller is connected to theAgilent 33220A signal generator through L…

只需几次点击即可创建一个Astra和LearnDash在线教育网站 – 简单快捷!

Astra为不喜欢从头开始设计网站的任何人提供了一个巨大的入门模板库。 这些网站是使用各种页面构建器制作的&#xff0c;例如 Elementor、Beaver Builder、Brizy 以及 Gutenberg——WordPress 的默认新编辑器。如果您喜欢这些网站中的任何一个&#xff0c;只需单击一下即可将其…

node.js+uni计算机毕设项目短视频管理小程序(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等…

18、Mysql高级之日志

18、Mysql高级之日志 文章目录18、Mysql高级之日志1、错误日志2、二进制日志2.1、概述2.2、日志格式2.3、日志读取2.4、日志删除3、查询日志4、慢查询日志4.1、文件位置和格式4.2、日志的读取在任何一种数据库中&#xff0c;都会有各种各样的日志&#xff0c;记录着数据库工作的…

数据结构(1)前言

&#xff08;1&#xff09;学习数据结构前&#xff0c;需要掌握结构体和指针的使用&#xff0c;需要了解typedef这个关键字。对这部分知识欠缺的可以查看&#xff1a;C语言结构体详解&#xff1b;何为指针&#xff0c;与数组名有什么区别&#xff1b; &#xff08;2&#xff09…

一次性记录关键字,注释,字符串值,运算符,括号配对的位置,并设置自定义数据颜色。

未执行函数之前&#xff1a; 执行后参数未加数据&#xff1a; 执行后参数加上数据&#xff1a; 源代码&#xff1a; /// <summary> /// 一次性记录关键字&#xff0c;注释&#xff0c;字符串值&#xff0c;运算符&#xff0c;括号配对的位置,并设置自定义数据颜色 /// &l…

关于Spring的两三事:神奇的注解

一、前言 在之前的学习中我们介绍了注解实际上起到的是标记和注释的作用&#xff0c;其本身并不提供任何的逻辑处理能力。也就是说如果想让注解能够实现预期的作用&#xff0c;就必须给注解搭配一个能够读取并处理该注解的方法&#xff0c;这里为了方便描述我将这样一个方法定义…

小学生C++编程基础 课程11(共8题)

946.数的数字和(课程A&#xff09; 难度&#xff1a;1 登录 947.数的颠倒 ( 课程A&#xff09; 难度&#xff1a;1 登录 948.求8的个数 (课程A&#xff09; 难度&#xff1a;1 登录 949.删除数字0 (课程A&#xff09; 难度&#xff1a;1 登录 950.垒三角形 (课程A&#xff…

RabbitMQ 第二天 高级 7 RabbitMQ 高级特性 7.6 延迟队列

RabbitMQ 【黑马程序员RabbitMQ全套教程&#xff0c;rabbitmq消息中间件到实战】 文章目录RabbitMQ第二天 高级7 RabbitMQ 高级特性7.6 延迟队列7.6.1 延迟队列概述7.6.2 代码实现7.6.3 小结第二天 高级 7 RabbitMQ 高级特性 7.6 延迟队列 7.6.1 延迟队列概述 【重点】 延…

Leetcode 剑指 Offer II 007. 数组中和为 0 的三个数

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i…

微信开放平台之第三方平台开发,从哪里入手?

大家好&#xff0c;我是悟空码字 疫情之下&#xff0c;最近有不少兄弟没有挺进决赛&#xff0c;半途成了小羊人&#xff0c;可谓是出师未捷身先死。话说回来&#xff0c;不管怎么样&#xff0c;尽量保护好自己&#xff0c;能越晚变羊越好。 开始说正事&#xff0c;不管是自己…

46_SDIO实验

目录 SDIO相关结构体 SDIO初始化结构体 SDIO命令初始化结构体 SDIO数据初始化结构体 硬件连接 实验源码 SDIO相关结构体 标准库函数对SDIO外设建立了三个初始化结构体&#xff0c;分别为SDIO初始化结构体SDIO_InitTypeDef, SDIO命令初始化结构体SDIO_CmdInitTypeDef和SD…