以下算法均包含在头文件 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)的更多相关文章

  1. STL中的所有算法(70个)

    STL中的所有算法(70个)----9种类型(略有修改by crazyhacking) 参考自: http://www.cppblog.com/mzty/archive/2007/03/14/1981 ...

  2. STL中的算法

    STL中的所有算法(70个) 参考自:http://www.cppblog.com/mzty/archive/2007/03/14/19819.htmlhttp://hi.baidu.com/ding ...

  3. STL中map与hash_map容器的选择收藏

    这篇文章来自我今天碰到的一个问题,一个朋友问我使用map和hash_map的效率问题,虽然我也了解一些,但是我不敢直接告诉朋友,因为我怕我说错了,通过我查询一些帖子,我这里做一个总结!内容分别来自al ...

  4. STL中vector、list、deque和map的区别

    1 vector     向量 相当于一个数组    在内存中分配一块连续的内存空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capac ...

  5. 【转】STL中vector、list、deque和map的区别

    1.vector 向量 相当于一个数组 在内存中分配一块连续的内容空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacity()函数 ...

  6. STL中六大组件

    1)容器(Container),是一种数据结构,如list,vector,和deques ,以模板类的方法提供.为了访问容器中的数据,可以使用由容器类输出的迭代器: 容器(container)用于存放 ...

  7. STL中的set容器的一点总结

    1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...

  8. STL中的next_permutation

    给定一个数组a[N],求下一个数组. 2 1 3 4 2 1 4 3 2 3 1 4 2 3 4 1 ..... 在STL中就有这个函数: 1.参数是(数组的第一个元素,数组的末尾),注意这是前闭后开 ...

  9. 3.2 STL中的函数对象类模板

    *: STL中有一些函数对象类模板,如下所示: 1)例如要求两个double类型的x 和y 的积,可以: multiplies<double>()(x,y); 该表达式的值就是x*y的值. ...

随机推荐

  1. 【Vulnhub靶场】RED: 1

    环境准备 下载靶机导入到vmware 但是获取不到地址,可以根据我博客里的方法修改网卡来获取IP地址 信息收集 我们改好网卡之后,我们使用arp-scan命令来探测靶机的IP地址 靶机IP地址为:19 ...

  2. Linux 电子数据取证入门

    目录 Linux Basic Analysis 一.常见的Linux 发行版 二.Linux 系统的典型目录结构(Dir Structure) 三.Linux 系统重要文件夹与文件的内容 四.Linu ...

  3. JavaWeb 03_创建servlet项目(详细)

    一.创建web项目 1. File--New--Project 2. 设置项目相关信息 3. 设置项目名称及工作空间 4. web项目目录结构如下 二.Servlet的实现 1. 新建包---类    ...

  4. ansible 二主机和组

    主机清单的管理 Ansible安装好之后的主机清单配置文件有如下两种: 1.yum安装,配置文件默认路径为: /etc/ansible/hosts 2.源码包安装,主机清单配置文件路径需要从软件包里面 ...

  5. Thread 类中的 yield 方法有什么作用?

    使当前线程从执行状态(运行状态)变为可执行态(就绪状态). 当前线程到了就绪状态,那么接下来哪个线程会从就绪状态变成执行状态呢?可 能是当前线程,也可能是其他线程,看系统的分配了.

  6. Spring-boot-菜鸟-properties配置

    如果测试结果出现中文乱码: 结果": Person{lastName='张胜男', age=11, boss=false, birth=Wed Nov 11 00:00:00 CST 202 ...

  7. 什么是 spring 的内部 bean?

    只有将 bean 用作另一个 bean 的属性时,才能将 bean 声明为内部 bean. 为了定义 bean,Spring 的基于 XML 的配置元数据在 <property> 或 &l ...

  8. Zookeeper Watcher 机制 -- 数据变更通知 ?

    Zookeeper 允许客户端向服务端的某个 Znode 注册一个 Watcher 监听,当服务 端的一些指定事件触发了这个 Watcher,服务端会向指定客户端发送一个事件通 知来实现分布式的通知功 ...

  9. TCP(三)

    1.三次握手 置位概念:根据TCP的包头字段,存在3个重要的标识ACK.SYN.FIN ACK:表示验证字段 SYN:位数置1,表示建立TCP连接 FIN:位数置1,表示断开TCP连接 三次握手过程说 ...

  10. 学习Apache(二)

    反向代理负载均衡之APACHE 一.反向代理1.1 介绍反响代理 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将 ...