当前课程知识点:数据结构(上) > 第二章 向量(上) > (c)无序向量 > 02C-8 遍历
最后来考察向量的遍历操作
所谓遍历就是
按照某种事先约定的操作
我们称之为visit
对向量中的每一个元素
逐一地、统一地执行一次
所以这里涉及到两个问题
第一,我们如何来指定
或者来描述这样一个visit操作
第二,如何将它传递到
向量内部的每一个具体的元素
这里我们说有两种方法
第一种,我们用的是
函数指针
这样的一个机制
也就是说,可以对于
vector这样一个类
定义一个traverse接口
作为它的参数,本身
就是一个函数的指针
它的名字叫visit
所以呢,为了兑现
这样的一个遍历操作
我们只需要逐一地取出
向量中由这个 i 确定的每一个元素
通过这个函数指针
找到这个函数
并且对这个元素实施这个函数
所指定的操作
第二种方式呢
是所谓的函数对象的这种机制
也就是说,我们指定的这个参数
visit的呢,本身就是一个对象
只不过呢,它的作用
就是用来模拟一个操作
一个函数的一个行为方式
所以同样地,我们也可以
对这个向量中的每一个元素
都逐一地取出
并且转交给这样一个函数对象
通过它,来实施具体地、统一地操作
那么这两种方法
其实是非常接近
但是也有一些重要的区别
我们相对而言
后一种方式的通用性更强
下面我们通过一个实例
来具体讲解如何通过函数对象
实现刚才所说的具体地遍历
比如说,我们可以考虑
将向量中的所有的元素
统一地各自加一
为此我们只需要
实现这么样一个,对应功能的函数对象
它本身也是以一个类的形式给出来的
我们可以看到
当然这里为了简化起见
我们使用了struct
而没有进行过多的封装
这个对象最重要的一个作用
或者说唯一的作用就是重载了
它的圆括号操作符
从而使得它在行为上
与一个函数非常的类似
而具体的功能就是
把每一个参数e
做一个加一操作
在实现了这样一个对应的类之后
我们就可以通过
这样的一个调用
也就调用vector
统一的traverse
那个遍历的接口
将我们刚刚编写的
这个函数对象
以参数的形式传入
就可以实现
相应的这个功能
也就是把向量中的
每一个元素统一地加一
那么作为练习
大家可以举一反三
实现更为复杂的一些遍历功能
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)计算
--演示
--(a)计算--作业
-(b)计算模型
-(b)计算模型--作业
-(c)大O记号
-(c)大O记号--作业
-(d)算法分析
-(d)算法分析--作业
-(e)迭代与递归
-(e)迭代与递归--作业
-(xc)动态规划
-- 演示
-(xc)动态规划--作业
-本章测验--作业
-(a)接口与实现
--02A-5 复制
-(a)接口与实现--作业
-(b)可扩充向量
-(b)可扩充向量--作业
-(c)无序向量
--02C-1 概述
--02C-3 插入
--02C-6 查找
--02C-8 遍历
-(c)无序向量--作业
-(d1)有序向量:唯一化
-(d1)有序向量:唯一化--作业
-(d2)有序向量:二分查找
-(d2)有序向量:二分查找--作业
-(d3)有序向量:Fibonacci查找
-(d3)有序向量:Fibonacci查找--作业
-(d4)有序向量:二分查找(改进)
-(d4)有序向量:二分查找(改进)--作业
-(d5)有序向量:插值查找
-第二章 向量(下)--(d5)有序向量:插值查找
-(e)起泡排序
--02E-2 改进
--02E-3 反例
-(e)起泡排序--作业
-(f)归并排序
-(f)归并排序--作业
-本章测验--作业
-(a)接口与实现
--03A-4 实现
-(a)接口与实现--作业
-(b)无序列表
--03B-2 查找
-(b)无序列表--作业
-(c)有序列表
--03C-3 查找
-(c)有序列表--作业
-(d)选择排序
--03D-1 构思
--03D-2 实例
--03D-3 实现
--03D-4 推敲
--03D-6 性能
-(d)选择排序--作业
-(e)插入排序
--03E-1 经验
--03E-2 构思
--03E-3 对比
--03E-4 实例
--03E-5 实现
-(e)插入排序--作业
-(xd)习题辅导:LightHouse
-本章测验--作业
- (a)栈接口与实现
--04A-1 栈
--04A-2 实例
--04A-3 实现
- (a)栈接口与实现--作业
-(c1)栈应用:进制转换
-第四章 栈与队列--(c1)栈应用:进制转换
-(c2)栈应用:括号匹配
-(c2)栈应用:括号匹配--作业
-(c3)栈应用:栈混洗
-第四章 栈与队列--(c3)栈应用:栈混洗
-(c4)栈应用:中缀表达式求值
-(c4)栈应用:中缀表达式求值--作业
-(c5)栈应用:逆波兰表达式
-第四章 栈与队列--(c5)栈应用:逆波兰表达式
-(d)队列接口与实现
--04D-1 接口
--04D-2 实例
--04D-3 实现
-第四章 栈与队列--本章测验
-(a)树
--05A-1 动机
--05A-2 应用
-(a)树--作业
-(b)树的表示
--05B-2 父亲
--05B-3 孩子
-第五章 二叉树--(b)树的表示
-(c)二叉树
-(c)二叉树--作业
-(d)二叉树实现
-(d)二叉树实现--作业
-(e1)先序遍历
-(e1)先序遍历--作业
-(e2)中序遍历
-第五章 二叉树--(e2)中序遍历
-(e4)层次遍历
-第五章 二叉树--(e4)层次遍历
-(e5)重构
-(e5)重构--作业
-本章测验--作业
-(a)概述
-(a)概述--作业
-(b1)邻接矩阵
-(b1)邻接矩阵--作业
-(c)广度优先搜索
--06C-2 策略
--06C-3 实现
--06C-5 实例
-(c)广度优先搜索--作业
-(d)深度优先搜索
--06D-1 算法
--06D-2 框架
--06D-3 细节
-(d)深度优先搜索--作业
-第六章 图--本章测验