STL_算法_06_遍历算法
◆ 常用的遍历算法:
1.1、用指定函数依次对指定范围内所有元素进行迭代访问。该函数不得修改序列中的元素
functor for_each(iteratorBegin, iteratorEnd, functor对每个元素进行操作);
1.2、与for_each类似,遍历所有元素,但可对容器的元素进行修改( transform 是变换的意思)
OutputIterator transform(InputIterator _First1, InputIterator _Last1, OutputIterator _Result, 一元functor对每个元素进行操作);
OutputIterator transform(InputIterator1 _First1, InputIterator1 _Last1, InputIterator2 _First2, OutputIterator _Result, 二元functor对每个元素进行操作);
1、
1.1、第6讲 PPT.42
◆ for_each() : 用指定函数依次对指定范围内所有元素进行迭代访问。该函数不得修改序列中的元素。
ZC: 只有一种参数格式,返回值为 传入的functor 。
ZC: vs2010 测试代码:
#ifdef WIN32
#pragma warning (disable: 4786)
#endif #include <string>
#include <vector>
#include <set> #include <algorithm> // 算法
#include <numeric> // 算法
#include <functional> // 算法 using namespace std; typedef void (*FUNC1)(const int &_iItem);
void (*FUNC2)(const int &_iItem); void Show(const int &iItem)
{
//cout << iItem;
printf("iItem : %d\n", iItem);
} void main()
{
int iArray[] = {,,,,};
vector<int> vecInt(iArray, iArray+sizeof(iArray)/sizeof(iArray[]));
//FUNC1 = for_each(vecInt.begin(), vecInt.end(), Show); // ZC: 编译通不过
FUNC2 = for_each(vecInt.begin(), vecInt.end(), Show); if (FUNC2 == Show)
printf("FUNC2 == Show\n");
else
printf("FUNC2 != Show\n"); system("pause");
}
ZC:控制台输出:
iItem : 0
iItem : 1
iItem : 2
iItem : 3
iItem : 4
FUNC2 == Show
请按任意键继续. . .
1.2、第6讲 PPT.42
◆ transform() : 与for_each类似,遍历所有元素,但可对容器的元素进行修改
ZC: 2种参数格式,返回值为 输出容器中 经过转换后的最后一个元素的iterator 。
ZC: VC6 测试代码:
#ifdef WIN32
#pragma warning (disable: 4786)
#endif #include <string>
#include <vector>
#include <set> #include <algorithm> // 算法
#include <numeric> // 算法
#include <functional> // 算法 using namespace std; int Increase (int i)
{
return i+;
} void main()
{
vector<int> vecIntA;
vecIntA.push_back();
vecIntA.push_back();
vecIntA.push_back();
vecIntA.push_back();
vecIntA.push_back(); transform(vecIntA.begin(), vecIntA.end(), vecIntA.begin(), Increase); //vecIntA : {2,4,6,8,10} int iIdx = ;
vector<int>::iterator it = vecIntA.begin();
while (it != vecIntA.end())
{
printf("[%02d] ==> %d\n", iIdx, *it);
it ++;
}
}
ZC:控制台输出 - 1:
[00] ==> 2
[00] ==> 4
[00] ==> 6
[00] ==> 8
[00] ==> 10
Press any key to continue
ZC: vs10 测试代码:
// alg_transform.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional>
#include <iostream> // The function object multiplies an element by a Factor
template <class Type>
class MultValue
{
private:
Type Factor; // The value to multiply by
public:
// Constructor initializes the value to multiply by
MultValue ( const Type& _Val ) : Factor ( _Val )
{} // The function call for the element to be multiplied
int operator ( ) ( Type& elem ) const
{
return elem * Factor;
}
}; template <class Type>
class MultValue2
{
private:
Type Factor; // The value to multiply by
public:
// Constructor initializes the value to multiply by
MultValue2 ( const Type& _Val ) : Factor ( _Val )
{} // The function call for the element to be multiplied
int operator ( ) ( Type& elem1, Type& elem2 ) const
{
return elem1*elem2 * Factor;
}
}; int main( )
{
using namespace std;
vector <int> v1, v2(), v3();
vector <int>::iterator Iter1, Iter2 , Iter3; // Constructing vector v1
int i;
for ( i = - ; i <= ; i++ )
{
v1.push_back( i );
} cout << "Original vector v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl << endl; // Modifying the vector v1 in place
transform (v1.begin ( ) , v1.end ( ) , v1.begin ( ) , MultValue<int> ( ) );
cout << "The elements of the vector v1 multiplied by 2 in place gives:"
<< "\n v1mod = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl << endl; // Using transform to multiply each element by a factor of 5
transform ( v1.begin ( ) , v1.end ( ) , v2.begin ( ) , MultValue<int> ( ) ); cout << "Multiplying the elements of the vector v1mod\n "
<< "by the factor 5 & copying to v2 gives:\n v2 = ( " ;
for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )
cout << *Iter2 << " ";
cout << ")." << endl << endl; // The second version of transform used to multiply the
// elements of the vectors v1mod & v2 pairwise
// ZC: 预定义的 二元functor
//transform ( v1.begin ( ) , v1.end ( ) , v2.begin ( ) , v3.begin ( ) ,
// multiplies <int> ( ) );
// ZC: 自定义的 二元functor
transform ( v1.begin ( ) , v1.end ( ) , v2.begin ( ) , v3.begin ( ) , MultValue2<int> ( ) ); cout << "Multiplying elements of the vectors v1mod and v2 pairwise "
<< "gives:\n v3 = ( " ;
for ( Iter3 = v3.begin( ) ; Iter3 != v3.end( ) ; Iter3++ )
cout << *Iter3 << " ";
cout << ")." << endl; system("pause");
}
ZC:控制台输出 - 2:
Original vector v1 = ( -4 -3 -2 -1 0 1 2 ). The elements of the vector v1 multiplied by 2 in place gives:
v1mod = ( -8 -6 -4 -2 0 2 4 ). Multiplying the elements of the vector v1mod
by the factor 5 & copying to v2 gives:
v2 = ( -40 -30 -20 -10 0 10 20 ). Multiplying elements of the vectors v1mod and v2 pairwise gives:
v3 = ( 640 360 160 40 0 40 160 ).
请按任意键继续. . .
?.?、第6讲 PPT.?
◆
ZC: VC6 测试代码:
ZC:控制台输出:
X
STL_算法_06_遍历算法的更多相关文章
- 链表创建和链表遍历算法的演示_C语言
今天搞了一个多小时,头是疼的,应该是没休息好吧,学习了数据结构这一节,感觉收益良多,下面贴上代码和心得: /*24_链表创建和链表遍历算法的演示*/ # include <stdio.h> ...
- Kasaraju算法--强连通图遍历及其python实现
在理解有向图和强连通分量前必须理解与其对应的两个概念,连通图(无向图)和连通分量. 连通图的定义是:如果一个图中的任何一个节点可以到达其他节点,那么它就是连通的. 例如以下图形: 这是最简单的一个连通 ...
- 图的遍历算法:DFS、BFS
在图的基本算法中,最初需要接触的就是图的遍历算法,根据访问节点的顺序,可分为深度优先搜索(DFS)和广度优先搜索(BFS). DFS(深度优先搜索)算法 Depth-First-Search 深度优先 ...
- STL_算法_01_查找算法
1. 来自教程:第6讲 PPT.15 ◆ 常用的查找算法: 1.1.按条件查找N个相邻的元素 ( adjacent 是 邻近的意思) iterator = adjacent_find(iterator ...
- 树的遍历算法-只有一个变量T-递归和非递归
void PostOrderTraverse(BTNode *T) { //就用到了一个变量T if(T==NULL) return; PostOrderTraverse(T->lchild); ...
- 经典算法 Morris遍历
内容: 1.什么是morris遍历 2.morris遍历规则与过程 3.先序及中序 4.后序 5.morris遍历时间复杂度分析 1.什么是morris遍历 关于二叉树先序.中序.后序遍历的递归和非递 ...
- javascript数据结构与算法--二叉树遍历(后序)
javascript数据结构与算法--二叉树遍历(后序) 后序遍历先访问叶子节点,从左子树到右子树,再到根节点. /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * * * */ ...
- javascript数据结构与算法--二叉树遍历(先序)
javascript数据结构与算法--二叉树遍历(先序) 先序遍历先访问根节点, 然后以同样方式访问左子树和右子树 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...
- javascript数据结构与算法--二叉树遍历(中序)
javascript数据结构与算法--二叉树遍历(中序) 中序遍历按照节点上的键值,以升序访问BST上的所有节点 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...
随机推荐
- MVC5 新建项目里不包含jquery.unobtrusive-ajax.js(MVC5异步表单的问题)解决方法
Asp.NET MVC 5 高级编程第5版.pdf 中有解决方法: 用NUGET程序包管理器控制台安装下面这两个文件 Install-Package jQuery –version 1.10.2 In ...
- 小试---EF5.0简介
简介 实体框架Entity Framework 是 ADO.NET 中的一组支持开发面向数据的软件应用程序的技术.是微软的一个ORM框架.简单的说就是把关系型数据库映射成面向对象模型. 一篇更加详细的 ...
- Python: 去掉字符串开头、结尾或者中间不想要的字符
①Strip()方法用于删除开始或结尾的字符.lstrip()|rstirp()分别从左右执行删除操作.默认情况下会删除空白或者换行符,也可以指定其他字符. ②如果想处理中间的空格,需要求助其他技术 ...
- linux常用命令:ping 命令
Linux系统的ping 命令是常用的网络命令,它通常用来测试与目标主机的连通性,我们经常会说“ping一下某机器,看是不是开着”.不能打开网页时会说“你先ping网关地 址192.168.1.1试试 ...
- Qt 学习之路 2(55):数据库操作
Qt 提供了 QtSql 模块来提供平台独立的基于 SQL 的数据库操作.这里我们所说的“平台独立”,既包括操作系统平台,又包括各个数据库平台.另外,我们强调了“基于 SQL”,因为 NoSQL 数据 ...
- 程序猿职场心理学,教你三进三出“斩”HR拿offer(跳槽必看)
摘要: 今天主要涉及到的是 HR 在面试时有哪些套路,这样可以见招拆招,斩获 offer! 今天主要涉及到的是 HR 在面试时有哪些套路,这样可以见招拆招,斩获 offer! 主要包括以下内容: 一. ...
- go环境搭建—基于CentOS6.8
1. 背景 在当前的中国网络环境下,我们无法访问Google的服务的,包括Golang.org.从第三方网站下载预编译的二进制Go发行版可能存在第三方源代码注入的风险,例如之前的XcodeGhost. ...
- 20145335郝昊《网络攻防》Exp4 MS11_050
20145335郝昊<网络攻防>Exp4 MS11_050 实验内容 初步掌握平台matesploit的使用 了解漏洞MS11_050漏洞:use-after-free漏洞,即对象被释放之 ...
- 2018-2019-1 20189218《Linux内核原理与分析》第四周作业
构造简单的Linux内核 显然用实验楼配好的环境做这个实验太简单了,按照没有困难制造困难也要上的原则,在自己的64位虚拟机上做这个实验. 按照课本(视频)上的步骤一直做下去,到编译生成init时出现了 ...
- 20145204《网络对抗》逆向及bof基础实践
20145204<网络对抗>逆向及bof基础实践 实践目的说明 实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何 ...