- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第11章 STL应用 11.1算法的综合应用11.2在数据结构中的应用11.3在Visual C++中应用11.1算法的综合应用 11.1.1在多态中的应用 【例11.1】已知画图基类Shape,多态函数Draw,圆类Circle、正方形类Square都从其派生。创建一个含有Shape指针的vector,指向多个Shape对象,首先画出每个Squre,并按其长度进行升序排序;其次画出每个Circle,并按其半径进行升序排序。程序代码11.1.2 set,map应用【例11.2】一篇英文文本文件,要求:创建一个集合,保存文件中都出现了哪些单词;创建一个映射,保存单词及该单词在文件中出现的次数。11.1.3 INI文件解析【例11.3】利用STL解析INI文件 INI文件格式示例[mydatabase]connect=jdbc:odbc:mysrcuser=administratorpwd=123456[mytable]tablename=studenttablefields=studno,studname,age,birthday主要有三种元素:section?,key,value。key-value也叫键值对,位于等号左右两侧。左侧叫做key,既关键码;右侧叫做值,它们是成对出现的。section是由中括号“[]”标识的。一个INI文件是由多个section组成的,一个section是由多个key-value键值对组成的。我们的任务就是把INI文件中的信息以一定的方式保存在程序结构中,代码如下所示。 程序代码从语义上来说,一个section由多个key-value键值对组成,一个INI文件由多个section组成。因此前者与基本类MySection相对应,后者与MySection集合类MySectionCollect相对应。而ReadIni是读INI文件类,主要功能是根据INI配置文件填充MySectionCollect对象。11.1.4 综合查询【例11.4】已知4个文本文件:学生信息stud.dat,每行信息包括学号、姓名、年龄、性别;课程信息cour.dat,每行信息包括课号、课名;成绩信息grade.dat,每行信息包括学号、课号、成绩。编功能类,可以完成下述的查询功能。①根据学号查询,输出学号、姓名、课程名、成绩。②哪些学生选了所有课程,输出其学号。③查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列。④查询每门课程最好的前两名同学的学号。11.2在数据结构中的应用 11.2.1 全排列应用【例11.5】给定一个n个整数的集合X={x1,x2,……,xn}和整数y,找出和等于y的X的子集Y。比如说:如果:X={10,20,30,40,50,60},y=60。则有三种不同长度的解,它们分别是:{10,20,30},{20,40},{60}。分析:X有6个元素,相对于3个解,可以用布尔向量表示为:{1,1,1,0,0,0},{0,1,0,1,0,0},{0,0,0,0,01}。值为1的部分是解中的元素。换一个说法就是:从6个数据中取1个,是否等于60?从6个数据中取2个数据,之和是否等于60?……从6个数据中取6个数据,之和是否等于60?因此转化为从布尔向量{0,0,0,0,0,1}开始,到{1,1,1,1,1,1}结束,哪些是符合条件的布尔向量。那么如何变化布尔向量的取值呢?next_permutation就是一个比较好的选择。 【例11.6】八皇后问题。可以陈述如下:如何在 8*8的国际象棋棋盘上安排8个皇后,使得没有两个皇后能互相攻击?如果两个皇后处在同一行、同一列或同一条对角线上,则它们能互相攻击。由此可推广到n皇后问题:有n个皇后和一个n*n棋盘,如何摆放能互相不攻击? 程序代码11.2.2 频度问题【例11.7】求整形集合中各元素出现频度 算法如下:1.设置整形数组A中元素, 获得元素个数N2.sort(A)3.初始化查询起始指针,first?A, last?NULL, 查询值find_value? *first4.do5. last?upper_bound(first, A+nSize, find_value)6.根据发first, last查询起始指针显示查询元素及出现频度7. first?last8. if first!= A+nSize then find_value?*first9.while first!= A+nSize#include iostream#include algorithmusing namespace std;void main(){ int A[] = {1,3,2,3,4,3,6,3}; int nSize =
文档评论(0)