C++STL 中的数值算法(iota、accumulate、adjacent_difference、inner_product、partial_sum)
以下算法均包含在头文件 numeric 中
1.iota
该函数可以把一个范围内的序列从给定的初始值开始累加
先看用法。
例:
假设我需要一个长度为10,从5开始递增的序列
vector<int> a(10);
iota(begin(a), end(a), 5);
for (auto x : a) {
cout << x << " ";
}
输出:
5 6 7 8 9 10 11 12 13 14
这样就可以很方便的创建一个递增的序列,而不用使用for循环
此外,该函数是使用连续的支持 operator++()的 T 类型值填充序列
也就是说double类型也可以使用,string类型也可以使用。
只要是重载了++运算符的类型都可以使用。
2.accumulate
曾经在算法比赛中看见别人使用accumulate函数计算出了一个数组的和。
觉得特别的优雅,像这样:
vector<int> a(10);
iota(begin(a), end(a), 1);
cout << accumulate(begin(a), end(a), 0) << "\n"; // 计算从1加到10的和,从0开始加
输出:
55
从那天起,每当我要求一个序列的和的时候,我都会使用这个方法...
但是今天,当我看到accumulate的源码之后:
template <class InputIterator, class T>
T accumulate (InputIterator first, InputIterator last, T init)
{
while (first!=last) {
init = init + *first; // or: init=binary_op(init,*first) for the binary_op version
++first;
}
return init;
}
注意看这里:

哇哦,它竟然还支持二元仿函数,C++ functional库中的仿函数
于是,我有了一个大胆的想法。
求一个数组的乘积
vector<int> a(10);
iota(begin(a), end(a), 1);
cout << accumulate(begin(a), end(a), 1, multiplies<int>()) << "\n"; // 计算从1加到10的乘积,从1开始乘
输出:
3628800
同理,还可以求数组的减,数组的除,数组的模
3.partial_sum
这个函数可以用来求前缀和,前缀和指一个数组的某下标之前的所有数组元素的和(包含其自身)。
例如,1、2、3、4、5的前缀和数组为 1 3 6 10 15
vector<int> a(5);
iota(begin(a), end(a), 1);
partial_sum(begin(a), end(a), begin(a)); // 求a的前缀和,赋值给a数组(第三个参数)
for (auto x : a) {
cout << x << " ";
}
输出:
1 3 6 10 15
有了上一个函数的经验,我们还可以求一个数组的前缀乘、除等
例:
partial_sum(begin(a), end(a), begin(a), multiplies<int>());
输出:
1 2 6 24 120
4.adjacent_difference
这个函数可以对一个序列里相邻两个元素进行运算,通过differerce这个词可以看出来,默认是计算相邻两元素的差
vector<int> a{1, 4, 5, 100, 40};
adjacent_difference(begin(a), end(a), begin(a)); // 求a数组相邻元素的差,赋值给a数组(第三个参数)
for (auto x : a) {
cout << x << " ";
}
输出:
1 3 1 95 -60
今天我想计算相邻两元素的乘积
adjacent_difference(begin(a), end(a), begin(a), multiplies<int>());
输出:
1 4 20 500 4000
5.inner_product
- 这个函数默认情况下可以求序列中每个元素的内积之和:
vector<int> a(3);
iota(begin(a), end(a), 1);
cout << inner_product(begin(a), end(a), begin(a), 10) << "\n"; // 从初值10开始加上序列各元素的内积
输出:
24
- 还可以用来求两个序列元素两两相乘再相加的结果
vector<int> a{1, 2, 3};
vector<int> b{2, 3, 4};
// 1 * 2 + 2 * 3 + 3 * 4
cout << inner_product(begin(a), end(a), begin(b), 0) << "\n";
输出:
20
- 此外,还可以通过仿函数来替代上述的两个操作符 + 和 *
vector<int> a{1, 2, 3};
vector<int> b{2, 3, 4};
cout << inner_product(begin(a), end(a), begin(b), 1
, multiplies<int>(), minus<int>()) << "\n";
// 原来的加法 + // 原来的乘法 *
// 计算 (1 - 2) * (2 - 3) * (3 - 4) = -1
输出:
-1
C++STL 中的数值算法(iota、accumulate、adjacent_difference、inner_product、partial_sum)的更多相关文章
- STL中的所有算法(70个)
STL中的所有算法(70个)----9种类型(略有修改by crazyhacking) 参考自: http://www.cppblog.com/mzty/archive/2007/03/14/1981 ...
- STL中的算法
STL中的所有算法(70个) 参考自:http://www.cppblog.com/mzty/archive/2007/03/14/19819.htmlhttp://hi.baidu.com/ding ...
- STL中map与hash_map容器的选择收藏
这篇文章来自我今天碰到的一个问题,一个朋友问我使用map和hash_map的效率问题,虽然我也了解一些,但是我不敢直接告诉朋友,因为我怕我说错了,通过我查询一些帖子,我这里做一个总结!内容分别来自al ...
- STL中vector、list、deque和map的区别
1 vector 向量 相当于一个数组 在内存中分配一块连续的内存空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capac ...
- 【转】STL中vector、list、deque和map的区别
1.vector 向量 相当于一个数组 在内存中分配一块连续的内容空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacity()函数 ...
- STL中六大组件
1)容器(Container),是一种数据结构,如list,vector,和deques ,以模板类的方法提供.为了访问容器中的数据,可以使用由容器类输出的迭代器: 容器(container)用于存放 ...
- STL中的set容器的一点总结
1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...
- STL中的next_permutation
给定一个数组a[N],求下一个数组. 2 1 3 4 2 1 4 3 2 3 1 4 2 3 4 1 ..... 在STL中就有这个函数: 1.参数是(数组的第一个元素,数组的末尾),注意这是前闭后开 ...
- 3.2 STL中的函数对象类模板
*: STL中有一些函数对象类模板,如下所示: 1)例如要求两个double类型的x 和y 的积,可以: multiplies<double>()(x,y); 该表达式的值就是x*y的值. ...
随机推荐
- LGP4001题解
题目大意 给定一张无向图,需要消耗代价才能使一条边被[数据删除],求使这张图不连通的最小代价. 一看就是最小割的应用啊... 从 \(u\) 到 \(v\),边权为 \(w\) 的边,建两条:一条从 ...
- LGP3346题解
广义 SAM 比较简单的题/fad 题意:树上所有路径一共能够组成多少个本质不同子串? 并且数据保证最多只有20个叶子节点. 我们先来考虑一下一种特殊情况: 对于路径 \([u,v]\),\(u\) ...
- 1、如何抓取Modbus TCP/UDP 数据包实战
CEIWEI最近发布了Modbus RTU Over TCP/UDP 过滤监控的新工具,下面以Modbus RTU TCP为示例,讲解如何抓取Modbus通信数据包,因为CEIWEI ModbusMo ...
- 使用Typora做笔记
本文旨在分享使用Typora做笔记的一些心得 一.介绍 为什么要用Typora 作为一个程序员,在学习过程中打交道的不单单是文字,还有各种语言的代码块和公式,以及一些简单的流程图和思维导图(就目前而言 ...
- Centos7 使用Docker安装rocket.chat聊天工具
镜像下载.域名解析.时间同步请点击阿里云开源镜像站 下载安装 Rocket.Chat 目前最新的版本为 4.0.1,可以通过手动或者容器的方式安装.这里我推荐使用容器,部署过程会方便不少. 如果要用容 ...
- SpringBoot 如何实现异步编程,老鸟们都这么玩的!
镜像下载.域名解析.时间同步请点击 阿里巴巴开源镜像站 首先我们来看看在Spring中为什么要使用异步编程,它能解决什么问题? 为什么要用异步框架,它解决什么问题? 在SpringBoot的日常开发中 ...
- strcpy、strncpy 和安全的strncpy_s
strcpy和strncpy摘于linux 内核源码的/lib/string.c char *self_strcpy(char *dest, const char *src) { char *tmp ...
- 如何建立一个JDBC程序?
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sq ...
- Zookeeper 的典型应用场景 ?
Zookeeper 是一个典型的发布/订阅模式的分布式数据管理与协调框架,开发人员 可以使用它来进行分布式数据的发布和订阅. 通过对 Zookeeper 中丰富的数据节点进行交叉使用,配合 Watch ...
- 学习Apache(三)
对某个目录开启验证登录 <Directory /var/www/html/admin > AllowOverride All Order allow,deny Allow from all ...