STL前缀和及差分函数-partial_sum,adjacent_difference

今天刷题的时候,遇到了前缀和及差分,在这里记录一下。

关于前缀和及差分的知识可以看这篇文章 转载:前缀和与差分 图文并茂 超详细整理(全网最通俗易懂)

经过我在网上查了一顿之后,不出所料,STL提供了计算的函数。

  • 前缀和:partial_sum,头文件:numeric
  • 差分:adjacent_difference,头文件:numeric

下面是使用示范

#include <iostream>
#include <algorithm>
#include <numeric>
#include <iterator>
#include <vector>
using std::cin;
using std::cout;
using std::for_each;
using std::copy;
using std::partial_sum;
using std::adjacent_difference;
using std::ostream_iterator;
using std::vector;

int main()
{
	int number;
	cin >> number;
	vector<int> array(number), result1(number), result2(number);
	// 输入数组
	for_each(array.begin(), array.end(), [](auto& element) { cin >> element; });
	// 求数组的前缀和数组
	partial_sum(array.begin(), array.end(), result1.begin());
	// 求数组的差分数组
	adjacent_difference(array.begin(), array.end(), result2.begin());

	// 输出前缀和数组
	copy(result1.begin(), result1.end(), ostream_iterator<int>(cout, " "));
	cout.put('\n');

	// 输出差分数组
	copy(result2.begin(), result2.end(), ostream_iterator<int>(cout, " "));

	cout.put('\n');

	return 0;
}

输入:

5
1 3 1 7 5

输出:

1 4 5 12 17
1 2 -2 6 -2

使用就是如此简单,一行解决。此外,这两个函数都还支持自定义谓词。
下面这段代码可以实现和上面代码一样的效果。

#include <iostream>
#include <algorithm>
#include <numeric>
#include <iterator>
#include <vector>
using std::cin;
using std::cout;
using std::for_each;
using std::copy;
using std::partial_sum;
using std::adjacent_difference;
using std::ostream_iterator;
using std::vector;

// 自定义的谓词,模拟partial_sum默认的谓词
inline int func1(int a, int b)
{
	return a + b;
}

// 自定义的谓词,模拟adjacent_difference默认的谓词
inline int func2(int a, int b)
{
	return a - b;
}

int main()
{
	int number;
	cin >> number;
	vector<int> array(number), result1(number), result2(number);
	// 输入数组
	for_each(array.begin(), array.end(), [](auto& element) { cin >> element; });
	// 使用自定义的谓词求数组的前缀和数组
	partial_sum(array.begin(), array.end(), result1.begin(), func1);
	// 使用自定义的谓词求数组的差分数组
	adjacent_difference(array.begin(), array.end(), result2.begin(), func2);

	// 输出前缀和数组
	copy(result1.begin(), result1.end(), ostream_iterator<int>(cout, " "));
	cout.put('\n');

	// 输出差分数组
	copy(result2.begin(), result2.end(), ostream_iterator<int>(cout, " "));

	cout.put('\n');

	return 0;
}

STL大法好啊!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值