C++ STL 中的数值算法示例讲解

目录
  • 1.iota
  • 2.accumulate
  • 3.partial_sum
  • 4.adjacent_difference
  • 5.inner_product

以下算法均包含在头文件 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;
}

注意看这里:


202204080826522.png" />

哇哦,它竟然还支持二元仿函数,详解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 中的数值算法示例讲解的文章就介绍到这了,更多相关C++ 数值算法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ STL中五个常用算法使用教程及实例讲解

    目录 前言 sort()排序 常用遍历算法for_each() 常用遍历算法 搬运transform() 查找算法find 删除操作erase() 实例应用 前言 在C++中使用STL算法都要包含一个算法头文件 #include<algorithm> 这样我们才能使用这个STL算法函数 sort()排序 Sort函数包含在头文件为#include<algorithm>的c++标准库中,是一个专门用来排序的高效的函数,我们在解决问题时可以方便快捷的排列顺序. sort()函数中有三个

  • C++STL函数和排序算法的快排以及归并排序详解

    目录 一.队列是什么? 二.排序算法 1.快速排序 2.归并排序 总结 一.队列是什么? 头文件queue主要包括循环队列queue和优先队列priority_queue两个容器. 像栈一样,队列(queue)也是一种线性表,它的特性是先进先出,插入在一端,删除在另一端.就像排队一样,刚来的人入队(push)要排在队尾(rear),每次出队(pop)的都是队首(front)的人. 就像管道一样先进先出. 队列的相关概念: 1.队头与队尾: 允许元素插入的一端称为队尾,允许元素删除的一端称为队头.

  • C++ STL中vector容器的使用

    目录 一.vector (1)区分size()和capacity() (2)迭代器失效 (3)区分const_iterator和constiterator (4)区分reserve()和resize() (5)push_back和emplace (6)关于原位构造(定位new+完美转发) 总结 一.vector (1)区分size()和capacity() size():返回容纳的元素个数 capacity():返回当前分配存储的容量 (2)迭代器失效 (3)区分const_iterator和c

  • C++STL之vector模板类详解

    目录 前言 vector模板类 创建vector对象,遍历元素 迭代器 容器的基本方法 STL函数,sort 总结 前言 STL标准模板库是C++中非常有用的功能库.本篇从vector容器开始学习STL. vector模板类 创建vector对象,遍历元素 vector模板类在头文件vector中,用于存储数组,并采用动态内存分配. 创建一个vector对象并初始化长度,通过[]运算符访问元素: #include <vector> using namespace std; int main()

  • C++实现STL容器的示例

    各大容器的特点: 1.可以用下标访问的容器有(既可以插入也可以赋值):vector.deque.map: 特别要注意一下,vector和deque如果没有预先指定大小,是不能用下标法插入元素的! 2. 序列式容器才可以在容器初始化的时候制定大小,关联式容器不行: 3.注意,关联容器的迭代器不支持it+n操作,仅支持it++操作. 适配器的概念 适配器的意思就是将某些已经存在的东西进行限制或者组合变成一个新的东西,这个新的东西体现一些新的特性,但底层都是由一些已经存在的东西实现的. STL中的容器

  • C++ STL容器适配器使用指南

    目录 适配器 stack容器适配器 ️stack的介绍 ️stack的使用 ️stack的模拟实现 queue ️queue的介绍 ️queue的使用 ️queue的模拟实现 deque容器 priority-queue ️priority-queue的使用 ️priority-queue的模拟实现 适配器 适配器是一种设计模式(设计模式是一套被反复使用的.多数人知晓的.经过分类编目的.代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口.例如: 容器适配器让一种已存在的容

  • C++的STL中accumulate函数的使用方法

    目录 1.累加求和 2.自定义数据类型的处理 3.用法 前言: accumulate定义在#include中,作用有两个,一个是累加求和,另一个是自定义类型数据的处理 1.累加求和 int sum = accumulate(vec.begin() , vec.end() , 42); accumulate带有三个形参:头两个形参指定要累加的元素范围,第三个形参则是累加的初值.accumulate函数将它的一个内部变量设置为指定的初始值,然后在此初值上累加输入范围内所有元素的值.accumulat

  • C++ STL 中的数值算法示例讲解

    目录 1.iota 2.accumulate 3.partial_sum 4.adjacent_difference 5.inner_product 以下算法均包含在头文件 numeric 中 1.iota 该函数可以把一个范围内的序列从给定的初始值开始累加先看用法.例:假设我需要一个长度为10,从5开始递增的序列 vector<int> a(10); iota(begin(a), end(a), 5); for (auto x : a) { cout << x <<

  • PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)

    1.首先做主页面Ajax_pag.php 代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Ajax做分页</title> <script src="bootstrap/js/jquery-1.11.2.min.js"></script> <script src="Ajax_

  • hadoop中实现java网络爬虫(示例讲解)

    这一篇网络爬虫的实现就要联系上大数据了.在前两篇java实现网络爬虫和heritrix实现网络爬虫的基础上,这一次是要完整的做一次数据的收集.数据上传.数据分析.数据结果读取.数据可视化. 需要用到 Cygwin:一个在windows平台上运行的类UNIX模拟环境,直接网上搜索下载,并且安装: Hadoop:配置Hadoop环境,实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS,用来将收集的数据直接上传保存到HDFS,然后用MapReduce

  • 对Python中for复合语句的使用示例讲解

    当Python中用到双重for循环设计的时候我一般会使用循环的嵌套,但是在Python中其实还存在另一种技巧--for复合语句. 简单写一个小程序,用于延时循环嵌套功能如下: #!/usr/bin/python defFunc1(ten_num,one_num): for i in range(ten_num): for j in range(one_num): print(10 * i + j) Func1(2,5)的执行结果如下: 0 1 2 3 4 10 11 12 13 14 以上是一个

  • 将python运行结果保存至本地文件中的示例讲解

    一.建立文件,保存数据 1.使用python中内置的open函数 打开txt文件 #mode 模式 #w 只能操作写入 r 只能读取 a 向文件追加 #w+ 可读可写 r+可读可写 a+可读可追加 #wb+写入进制数据 #w模式打开文件,如果而文件中有数据,再次写入内容,会把原来的覆盖掉 file_handle=open('1.txt',mode='w') 2.向文件中写入数据 2.1 write写入 #\n 换行符 file_handle.write('hello word 你好 \n') 2

  • Mybatis示例讲解注解开发中的单表操作

    目录 Mybatis注解开发单表操作 MyBatis的常用注解 MyBatis的增删改查 注解开发总结 常用注解 配置映射关系 练习项目代码 Mybatis注解开发单表操作 MyBatis的常用注解 Mybatis也可以使用注解开发方式,这样我们就可以减少编写Mapper映射文件了.我们先围绕一些基本的CRUD来学习,再学习复杂映射多表操作. 注解 说明 @Insert 实现新增 @Update 实现更新 @Delete 实现删除 @Select 实现查询 @Result 实现结果集封装 @Re

  • jquery实现用户登陆界面(示例讲解)

    实例如下所示: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <script src="js/jquery-1.8.0.min.js"></script> <script> var cnresu = false; $(function(){

  • IKAnalyzer结合Lucene实现中文分词(示例讲解)

    1.基本介绍 随着分词在信息检索领域应用的越来越广泛,分词这门技术对大家并不陌生.对于英文分词处理相对简单,经过拆分单词.排斥停止词.提取词干的过程基本就能实现英文分词,单对于中文分词而言,由于语义的复杂导致分词并没英文分词那么简单,一般都是通过相关的分词工具来实现,目前比较常用的有庖丁分词以及IKAnalyzer等.这里我们主要通过一个简单的Demo聊聊IKAnalyzer的基本使用.IKAnalyzer是一个开源的,基于java开发的分词工具包,它独立于Lucene项目,同时提供了Lucen

  • Sublime Text 3 实现C语言代码的编译和运行(示例讲解)

    Sublime Text 3是一款优秀的代码编辑软件.界面简洁,轻巧快速,很受大家的欢迎. 最近开始用他来编辑数据结构的代码,这就需要在新建编译系统. 具体方法如下: 首先: 接下来是关键的一步,将以下代码粘贴到弹出的编辑页面中,文件名为name.sublime-build形式,name是新建的编译器名字. { "cmd": ["gcc","${file}","-fexec-charset=gbk","-o"

随机推荐