std::accumulate的使用以及注意点

头文件

 #include <numeric>

定义,

(1)	template< class InputIt, class T >
	T accumulate( InputIt first, InputIt last, T init );
	
(2)	template< class InputIt, class T, class BinaryOperation >
	T accumulate( InputIt first, InputIt last, T init,
              BinaryOperation op );

基本使用

一、累加求和

	vector<int> vi{ 1, 2, 3 };
	std::cout << accumulate(vi.begin(), vi.end(), 0) << std::endl;    // 6

最后一个0为初始值。得到的结果是0+1+2+3 = 6

二、自定义二元函数对象(比如lambda表达式等)

#include <iostream>
#include <numeric>
#include <string>
#include <vector>
using namespace std;

int main() {
	vector<int> vec0{ 1, 2, 3 };
	std::cout << accumulate(vec0.begin(), vec0.end(), 0) << std::endl;    // 6

	//求vec1中字符串的长度之和
	vector<string> vec1 = { "abcd", "ef", "ghi" };
	size_t totalSize = accumulate(vec1.begin(), vec1.end(), 0,
		[](size_t sum, const std::string& str) { return sum + str.size(); });
	std::cout << totalSize << std::endl;

	getchar();
	return 0;
}

运行结果:

6
9

可能的实现

版本一

template<class InputIt, class T>
constexpr // C++20 起
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>
constexpr // C++20 起
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;
}

注意点

一些算法只会读取其输入范围内的元素,而从不改变元素。比如find 和 accumulate。
还有注意std::accumulate返回值类型要注意。
在上面的可能实现中:

T accumulate(InputIt first, InputIt last, T init, 
             BinaryOperation op)

返回类型为T,和init类型是一致的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值