从“集合”实例分析修饰函数返回值的const作用.doc_第1页
从“集合”实例分析修饰函数返回值的const作用.doc_第2页
从“集合”实例分析修饰函数返回值的const作用.doc_第3页
从“集合”实例分析修饰函数返回值的const作用.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

从“集合”实例分析修饰函数返回值的const作用 这段时间在复习C+基础,算法与数据结构,以及学习STL。所以,SDL的教程更新会慢些。因为我还是以自己的项目为核心进行学习的,所以基础知识和游戏设计涉及到图形,控制和多线程的内容学习,应该是会有些交叉的。发现这个问题,是因为一直以来思考的一个算法关于“集合”的实现。这个集合就是数学中的集合,与计算机中数列一个最大的不同在于,集合的元素是互异的。因为这两天在熟悉vector,所以觉得用vector实现集合再合适不过了。STL确实是很好很强大的体系,无论是内存管理,还是链表的实现,让我们可以省很多心。其实关于为什么要实现集合,也是因为我在计划实现类似英雄无敌战场计算移动的一系列算法中,很多地方会用到集合的概念,甚至包括并集和差集等等。也许我想到的算法是很笨拙的,但是在我还没有完全阅读相关的已有代码之前,觉得完全凭自己的认识,实现这些算法还是很有意义的,所以,从学习C+的第一天开始,我就在试图找到解决这些问题的方法,而现在,越来越清晰了,呵呵。我的思路很直接也很简单,就是把一个数组中的元素往一个新的数组中填,新填充的元素会遍历新数组中已有的元素,如果与之互异,则填入(push),否则就跳到下一个。以上就已经确立了成员数据(私有)和构造函数。因为我们需要“集合化”了的数组是可以被外部访问的,所以一个最简单的方法就是把成员数据公有这确实是很简单,而且这样就不会出现今天我们要讨论的问题了;另外一个笨办法是用一个公有方法,返回成员数据的值我就是这么做的,因为这貌似更符合OOP的“数据隐藏”的精神-_-!。很快可以写出头文件:#ifndef AGGREGATE_H_#define AGGREGATE_H_#include #include #include class Aggregateprivate:std:vector agg;public:Aggregate(std:vector& temp);const std:vector getAgg() const;#endif请注意那个红色的const,其实我想说的是,第一次写这个程序的时候,我并没有这个const。一直以来,除了在重载“=”的时候我大概清楚修饰返回值const的作用是可以避免让返回值做左值,其他时候还真不太明白这个const的作用,只是本着C+的精神能const就const吧-_-!。实现文件:#include aggregate.hAggregate:Aggregate(std:vector& temp)for ( std:vector:iterator pTemp = temp.begin(); pTemp != temp.end(); pTemp+ ) bool findSame = false;for ( std:vector:iterator pAgg = agg.begin(); pAgg != agg.end(); pAgg+ )if ( *pTemp = *pAgg )findSame = true;if ( findSame = false )agg.push_back(*pTemp);const std:vector Aggregate:getAgg() constreturn agg;一切都很完美,不是吗?顺手就继续写出一个测试用的程序:#include aggregate.hvoid show(int& i);int main(int argc, char* argv)std:vector tempArray;int temp;bool goon = true;while ( goon = true ) std:cout # tempArray.size()+1 temp;if ( temp = -1 ) goon = false;continue;tempArray.push_back(temp);std:cout Youve entered tempArray.size() numbers. std:endl;for_each(tempArray.begin(), tempArray.end(), show);std:cout -n Now, to be aggregaten;Aggregate tempAgg (tempArray);std:cout There are tempAgg.getAgg().size() different numbers.n;for_each(tempAgg.getAgg().begin(), tempAgg.getAgg().end(), show);return 0;void show(int& i)std:cout i std:endl;很不幸,编译正常的通过了(注意,没有红色的const的时候)。但是,运行时出现了错误。运行时错误是件令人很郁闷的事情,因为这意味着编译器不会帮你找到出错的地方。幸运的是,直觉让我觉得类似tempAgg.getAgg().begin()的用法有问题,所以,我改成了:(紫色那部分代码)std:cout -n Now, to be aggregaten;Aggregate tempAgg (tempArray);std:vector tempAggArray = tempAgg.getAgg();std:cout There are tempAggArray.size() different numbers.n;for_each(tempAggArray.begin(), tempAggArray.end(), show);这样,问题是解决了。但是我们回头分析一下,刚才的问题到底出在什么地方呢?其实,如果我们加上红色的const,使用原来的代码进行编译的时候,编译器是可以指出我们的错误的,确实是tempAgg.getAgg().begin()的用法出了问题。具

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论