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 ...
随机推荐
- Hive错误:Unable to load native-hadoop library for your platform
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin- ...
- matplotlib--设置线条颜色及形状
一.控制颜色 b--blue c--cyan(青色) g--green k--black m--magenta(紫红色) r--red w--white y--yellow 颜色有三种表示方法,可以用 ...
- 【CUDA并行程序设计系列(1)】GPU技术简介
http://www.cnblogs.com/5long/p/cuda-parallel-programming-1.html 本系列目录: [CUDA并行程序设计系列(1)]GPU技术简介 [CUD ...
- input文本框只能输入数字
HTML中的input文本框有时候需要数字的做输入检查,如果能做输入之前限定只能输入数字的话,就可以省去在提交时候的输入内容检查了. 下面是自己在火狐浏览器上调试出的实现,实现原理就是在键盘事件(on ...
- 测试开发-web测试要点
参数输入考虑 参数数值包含1个.多个.很多个.null.参数值前后包含空格的2种情况 数字类型:正数.负数.0.0.0.+0.0.-0.0.指数.对数.分数.小数.复数.科学计数法的测试,全角的数 ...
- 2016NOI冬令营day3
上午第一课堂 第一次感觉能听... IOI题目选讲挺不错的,比较有趣(yong4) :) 然而接下来的“基础”数据结构就太神了,完全不会QAQ :( 下午我听得比较认真,VFK讲的是下一代评测系统 ...
- 解决“ 故障模块名称: clr.dll ”
错误内容: 微软的错误说明:http://support.microsoft.com/kb/2640103/zh-cn 类似下面的错误: 错误应用程序名称:xxx.exe,版本: 1.0.0.0,时间 ...
- ELK学习笔记之ELK架构与介绍
0x00 为什么用到ELK 一般我们需要进行日志分析场景:直接在日志文件中 grep.awk 就可以获得自己想要的信息.但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档.文本搜索太 ...
- bzoj1648 / P2853 [USACO06DEC]牛的野餐Cow Picnic
P2853 [USACO06DEC]牛的野餐Cow Picnic 你愿意的话,可以写dj. 然鹅,对一个缺时间的退役选手来说,暴力模拟是一个不错的选择. 让每个奶牛都把图走一遍,显然那些被每个奶牛都走 ...
- Python3.x与Python2.x的差异用法
Python3.x与Python2.x的差异用法 1,关于urllib2区别: # python2 import urllib2 # python3 # 用urllib.request代替urllib ...