【文件属性】:
文件名称:重轲向量操作符[]-web服务稳定性测试 负载测试 可靠性测试 测试报告
文件大小:10.35MB
文件格式:PDF
更新时间:2024-07-30 10:59:00
数据结构 邓俊辉 清华大学 mooc学堂在线 教材
§2.5 常规向量
2.5.1 直接引用元素
与数组直接通过下标访问元素的方式(形如“A[i]”)相比,向量ADT所设置的get()和put()
接口都显得不甚自然。毕竟,前一访问方式不仅更为我们所熟悉,同时也更加直观和便捷。那么,
在经过封装之后,对向量元素的访问可否沿用数组的方式呢?答案是肯定的。
解决的方法之一就是重载操作符“[]”,具体实现如代码2.6所示。
1 template T& Vector::operator[](Rank r) const //重载下标操作符
2 { return _elem[r]; } // assert: 0 <= r < _size
代码2.6 重轲向量操作符[]
2.5.2 置乱器
置乱算法
可见,经重载后操作符“[]”返回的是对数组元素的引用,这就意味着它既可以取代get()
操作(通常作为赋值表达式的右值),也可以取代set()操作(通常作为左值)。例如,采用这
种形式,可以简明清晰地描述和实现如代码2.7所示的向量置乱算法。
1 template void permute(Vector& V) { //随机置乱向量,使各元素等概率出现亍殏一位置
2 for (int i = V.size(); i > 0; i--) //自后向前
3 swap(V[i - 1], V[rand() % i]); //V[i - 1]不V[0, i)中某一随机元素交换
4 }
代码2.7 向量整体置乱算法permute()
该算法从待置乱区间的末元素开始,逆序地向前逐一处理各元素。如图2.2(a)所示,对每
一个当前元素V[i - 1],先通过调用rand()函数在[0, i)之间等概率地随机选取一个元素,再
令二者互换位置。注意,这里的交换操作swap(),隐含了三次基于重载操作符“[]”的赋值。
于是如图(b)所示,每经过一步这样的迭代,置乱区间都会向前拓展一个单元。因此经过O(n)
步迭代之后,即实现了整个向量的置乱。
图2.2 向量整体置乱算法permute()癿迭代过秳
在软件测试、仿真模拟等应用中,随机向量的生成都是一项至关重要的基本操作,直接影响
到测试的覆盖面或仿真的真实性。从理论上说,使用这里的算法permute(),不仅可以枚举出同
一向量所有可能的排列,而且能够保证生成各种排列的概率均等(习题[2-6])。