STL_算法_04_算术和生成算法
◆ 常用的算术和生成算法:
1.1、求和( accumulate 是求和的意思)(对指定范围内的元素求和,然后结果再加上一个由val指定的初始值。)
T accumulate(iteratorBegin, iteratorEnd, T _initialValue);
T accumulate(iteratorBegin, iteratorEnd, T _initialValue, functor某种计算方式);
1.2、填充(将输入值赋给标志范围内的所有元素)
void fill(iteratorBegin, iteratorEnd, T _value);
1、
1.1、第6讲 PPT.38
◆ accumulate() : 对指定范围内的元素 执行某种计算之后的结果,然后该结果 再和 val指定的初始值 执行一次该计算。
ZC: 默认是执行加法操作
ZC: 有两种 参数格式,返回值是 计算操作的结果。
ZC: VC6 测试代码 - 1:
#ifdef WIN32
#pragma warning (disable: 4786)
#endif #include <string>
#include <vector>
#include <set> #include <algorithm> // 算法
#include <numeric> // 算法
#include <functional> // 算法 using namespace std; void main()
{
vector<int> vecIntA;
vecIntA.push_back();
vecIntA.push_back();
vecIntA.push_back();
vecIntA.push_back();
vecIntA.push_back(); int iSum = accumulate(vecIntA.begin(), vecIntA.end(), ); //iSum==125
printf("%d\n", iSum);
}
ZC:控制台输出 - 1:
125
Press any key to continue
ZC: vs2010 测试代码 - 2(来自:https://msdn.microsoft.com/en-US/library/aawk6wsh(v=vs.80).aspx):
// numeric_accum.cpp
// compile with: /EHsc
#include <vector>
#include <numeric>
#include <functional>
#include <iostream> int MultipliesZ(const int& _iLeft, const int& _iRight) // ZC: 我的求乘积的functor
{
return (_iLeft * _iRight);
} int PlusZ(const int& _iLeft, const int& _iRight) // ZC: 我的求和的functor
{
return (_iLeft + _iRight);
} int Test01(const int& _iLeft, const int& _iRight)
{
return (_iLeft*_iLeft + _iRight*_iRight);
} int Test02(const int& _iLeft)
{
return ;
} int main( )
{
using namespace std; vector <int> v1, v2();
vector <int>::iterator iter1, iter2; int i;
for (i = ; i < ; i++)
{
v1.push_back(i);
} cout << "The original vector v1 is:\n ( " ;
for (iter1 = v1.begin(); iter1 != v1.end(); iter1++)
cout << *iter1 << " ";
cout << ")." << endl; // The first member function for the accumulated sum
int total;
total = accumulate(v1.begin(), v1.end(), ); cout << "The sum of the integers from 1 to 20 is: "
<< total << "." << endl; // Constructing a vector of partial sums
int j = , partotal;
for (iter1 = v1.begin(); iter1 != v1.end(); iter1++)
{
partotal = accumulate(v1.begin(), iter1 + , );
v2[j] = partotal;
j++;
} cout << "The vector of partial sums is:\n ( " ;
for (iter2 = v2.begin(); iter2 != v2.end(); iter2++)
cout << *iter2 << " ";
cout << ")." << endl << endl; // *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
// *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** // The second member function for the accumulated product
vector <int> v3, v4();
vector <int>::iterator iter3, iter4; int s;
for (s = ; s < ; s++)
{
v3.push_back(s);
} cout << "The original vector v3 is:\n ( " ;
for (iter3 = v3.begin(); iter3 != v3.end(); iter3++)
cout << *iter3 << " ";
cout << ")." << endl; int ptotal;
ptotal = accumulate(v3.begin(), v3.end(), , multiplies<int>()); cout << "The product of the integers from 1 to 10 is: "
<< ptotal << "." << endl; // Constructing a vector of partial products
int k = , ppartotal;
for (iter3 = v3.begin(); iter3 != v3.end(); iter3++) {
ppartotal = accumulate(v3.begin(), iter3 + , , multiplies<int>());
v4[k] = ppartotal;
k++;
} cout << "The vector of partial products is:\n ( " ;
for (iter4 = v4.begin(); iter4 != v4.end(); iter4++)
cout << *iter4 << " ";
cout << ")." << endl; // *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
// *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** printf("\n"); int iSumZ = accumulate(v1.begin(), v1.end(), , PlusZ);
int iProductZ = accumulate(v3.begin(), v3.end(), , MultipliesZ);
printf("ZC: sum ==> %d\n", iSumZ);
printf("ZC: product ==> %d\n", iProductZ); printf("\n"); vector<int> vecZ;
vector<int>::iterator itZ;
int z;
for (z = ; z <= ; z++)
{
vecZ.push_back(z);
//vecZ.push_back(1);
}
for (itZ = vecZ.begin(); itZ != vecZ.end(); itZ++)
{
printf("%d ", *itZ);
}
printf("\n");
int iTest01 = accumulate(vecZ.begin(), vecZ.end(), , Test01);
//int iTest01 = accumulate(vecZ.begin(), vecZ.end(), 5, Test02);
printf("ZC: iTest01 ==> %d\n", iTest01); system("pause"); // plus,minus,multiplies,divides,negate ==> 加,减,乘,除,取反
// 参考网址:http://blog.csdn.net/liusoftware5/article/details/6389050
}
ZC:控制台输出 - 2:
The original vector v1 is:
( 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ).
The sum of the integers from 1 to 20 is: 210.
The vector of partial sums is:
( 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 153 171 190 210 ). The original vector v3 is:
( 1 2 3 4 5 6 7 8 9 10 ).
The product of the integers from 1 to 10 is: 3628800.
The vector of partial products is:
( 1 2 6 24 120 720 5040 40320 362880 3628800 ). ZC: sum ==> 210
ZC: product ==> 3628800 1 2 3
ZC: iTest01 ==> 462409
请按任意键继续. . .
ZC: 上面的 462409 是怎么计算出来的?貌似是这样算出来的:
26 = 5*5 + 1*1
680 = 26*26 + 2*2
462409 = 680*680 + 3*3
ZC: 那这个计算步骤,又是怎么得来的??我是这样得到的:
一开始想不出,为什么结果会是 462409,后来试着 传入错误参数的 functor 看看结果会怎么样,像下面这样:
int iTest01 = accumulate(vecZ.begin(), vecZ.end(), 5, Test02);
编译时 就报错了,信息如下:
“
Error 1 error C2197: 'int (__cdecl *)(const int &)' : too many arguments for call C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\numeric 36
”
定位到 如下图所示 的地方:

于是知道了,原来是这样计算的。验证了一下,确实是OK的。
ZC: 其他算法的 functor的具体情况,应该也可以通过该方法来查看。
1.2、第6讲 PPT.38
◆ fill() : 将输入值赋给标志范围内的所有元素。
ZC: 只有一种 参数格式,返回值是 void 。
ZC: VC6 测试代码:
#ifdef WIN32
#pragma warning (disable: 4786)
#endif #include <string>
#include <vector>
#include <set> #include <algorithm> // 算法
#include <numeric> // 算法
#include <functional> // 算法 using namespace std; void main()
{
vector<int> vecIntA;
vecIntA.push_back();
vecIntA.push_back();
vecIntA.push_back();
vecIntA.push_back();
vecIntA.push_back(); fill(vecIntA.begin(), vecIntA.end(), ); //8, 8, 8, 8, 8 int iIdx = ;
vector<int>::iterator it = vecIntA.begin();
while (it != vecIntA.end())
{
printf("[%02d] ==> %d\n", iIdx, *it);
it ++;
iIdx ++;
}
}
ZC:控制台输出:
[00] ==> 8
[01] ==> 8
[02] ==> 8
[03] ==> 8
[04] ==> 8
Press any key to continue
?.?、第6讲 PPT.?
◆
ZC: VC6 测试代码:
ZC:控制台输出:
X
STL_算法_04_算术和生成算法的更多相关文章
- C++ STL 常用算术和生成算法
C++ STL 常用算术和生成算法 accumulate() accumulate: 对指定范围内的元素求和,然后结果再加上一个由val指定的初始值. #include<numeric> ...
- [迷宫中的算法实践]迷宫生成算法——递归分割算法
Recursive division method Mazes can be created with recursive division, an algorithm which wo ...
- ID3算法 决策树的生成(2)
# coding:utf-8 import matplotlib.pyplot as plt import numpy as np import pylab def createDataSet(): ...
- ID3算法 决策树的生成(1)
# coding:utf-8 import matplotlib.pyplot as plt import numpy as np import pylab def createDataSet(): ...
- 一个UUID生成算法的C语言实现 --- WIN32版本 .
一个UUID生成算法的C语言实现——WIN32版本 cheungmine 2007-9-16 根据定义,UUID(Universally Unique IDentifier,也称GUID)在时 ...
- 分布式全局不重复ID生成算法
分布式全局不重复ID生成算法 算法全局id唯一id 在分布式系统中经常会使用到生成全局唯一不重复ID的情况.本篇博客介绍生成的一些方法. 常见的一些方式: 1.通过DB做全局自增操作 优点:简单.高 ...
- C++ 基于凸包的Delaunay三角网生成算法
Delaunay三角网,写了用半天,调试BUG用了2天……醉了. 基本思路比较简单,但效率并不是很快. 1. 先生成一个凸包: 2. 只考虑凸包上的点,将凸包环切,生成一个三角网,暂时不考虑Delau ...
- C++ 凸包生成算法
由于我的极差记忆力,我打算把这个破玩意先记下来.因为以后会有改动(Delaunay三角网生成算法),我不想把一个好的东西改坏了... 好吧-- 凸包生成算法,: 1.先在指定的宽(width)高(he ...
- RocketMQ msgId生成算法
当我们用RocketMQ发送信息的时候通常都会返回如下信息: SendResult [sendStatus=SEND_OK, msgId=0A42333A0DC818B4AAC246C290FD000 ...
随机推荐
- NSLog打印NSInteger老是有warning
zSpecifies that a following [...] conversion specifier applies to a size_t or the corresponding sign ...
- numpy.random.rand()/randn()/randint()/normal()/choice()/RandomState()
这玩意用了很多次,但每次用还是容易混淆,今天来总结mark一下~~~ 1. numpy.random.rand(d0,d1,...,dn) 生成一个[0,1)之间的随机数或N维数组 np.random ...
- http协议基础(十)实体首部字段
1.定义 包含在请求和响应中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息 2.Allow 通知客户端能够支持的Request-URI指定资源的所有http方法:如果服务器接收到不支 ...
- 如何提取app软件的apk格式中的字体?
1.下载apk格式的指定app软件: 2.将apk格式的文件名更改为后缀名为zip格式: 3.用winrar解压软件解压,然后就找到其中的ttf格式的字体文件. 举例说明,我想找到airbnb的app ...
- unity Texture贴图纹理及相关属性
Texture资源是Unity3d游戏开发中用途最广泛的资源之一,被引用于诸如界面UI. Mesh模型 .粒子效果等.还有一些特殊的Texture资源,如:Movie Texture:视频资源.Ren ...
- [WPF]WPF开发方法论
纵观Windows GUI应用程序开发方法,从Windows API.MFC到Visual Basic再到.NET Framework,WPF的开发方法论是在.NET Framework方法论的基础上 ...
- Python: 没有switch-case语句
初学Python语言,竟然很久才发现Python没有switch-case语句 官方的解释说,“用if... elif... elif... else序列很容易来实现 switch / case 语句 ...
- ImageLoader作用 AAAA
https://github.com/nostra13/Android-Universal-Image-Loader ImageLoader作用 1.多线程下载图片,图片可以来源于网络,文件系统,项目 ...
- AJAX 与 Python 后台通信
Ajax 简介 Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术. Ajax = 异步 ...
- Win10 Ubuntu 双系统 卸载 Ubuntu
Win10 Ubuntu 双系统 卸载 Ubuntu 其实卸载 Ubuntu 系统很简单,进 win10 系统之后,磁盘管理,格式化 Ubuntu 的磁盘就可以了. 但是最费劲的是什么呢? 就是格式化 ...