- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
1.确保容器中的对象拷贝正确而高效 一旦一个对象被拷贝到容器,它经常会被进一步被拷贝:例如Vector,string,deque。而拷贝,其实很简单,就是利用一个对象的拷贝成员函数。当然在拷贝的过程中,当存在继承关系时,我们需要注意拷贝动作而导致的剥离。也就是说,当你创建一个存放基类对象的容器时,却向其中插入派生类的对象,那么派生类的对象所持有的特有部分将会丢失。而防止这种情况的产生就是使用Widget*的容器, 2,,调用empty而不是检查size()是不是0 对任何容器上使用if(c.size()==0).... 本质上与if(c.empty()).....是等价的。 为什么使用empty:empty对所有的标准容器都是常数时间操作,而对一些list的实现,size耗费线性时间(在于list所独有的splice操作)。 3.区间成员函数优先于与之对应的单元素成员函数 优势:1使用区间成员函数可以减少代码2.使用区间成员函数通常会使意图清晰,代码直接。 在能应用STL时,尽量避免自己写函数,例如显示的循环。 4.注意C++编译器最烦人的分析机制 假设有一个存有int的文件,想把这些整数复制到一个list中, 错误做法: Ifstream dataFile(“ints。Dat”); listint data(istream_iteratorint(dataFile),istream_iteratorint()); 编译器最后会编译成: 声明一个函数data,其返回值是listint,有两个参数,第一个参数是dataFile,类型为Istream_iterator,dataFile两边的括号会被忽略;第二个参数没名称。 又例如: Class Widget{}; Widget w(); 它没声明一个名为w的Widget,而是声明一个名为w的函数,该函数不带参数,并返回一个Widget。 正确的做法: Ifstream dataFile(“ints.dat”); Istream_iteratorint databigen(dataFile); Istream_iteratorintdataend; Listint data(databigen,dataend); 虽然使用命名的迭代器对象与通常的STL程序风格相违背,但这样能使编译器无二义性。 如果容器中包含了通过new创建的指针,切记在容器对象析构前将指针delete掉 原因:当容器包含的是通过new的方式而分配的指针时,指针容器在自己被析构时会析构所包含的每个元素,但指针的“析构函数”不做任何事,当然也不会delete。也就是说通过new的范式分派的指针,我们需要自己去手动delete。 例子: 下面代码直接导致资源泄漏: Void dosomething(){ Vectorwidget*vwp; For(int i=0;iNumber;++i) vwp.push_back(new widget); .........} 当vwp结束时,通过new创建的对象没被删除。 一般做法: void dosomething(){ Vectorwidget*vwp; ...... for(vectorwidget*::iterator i=vwp.begin(); i!=vwp.end();i++) delete *i; } 进阶做法: 利用STL中的for_each替代for循环做的事情。 首先创建彷函数,也就是函数对象: Templatetypename T Struct DeleteObject: public unary_functionconstT*,void{ 可配接的关键 Void operator()(constT*ptr)const{ Delete ptr;}}; Void dosomething (){ ...... For_each(vwp.begin(),vwp.end,DeleteObjectwidget());} 注意:这样从开始就不好,当指明DeleteObject要删除的是widget,而vwp是widget*。假设从string继承: Class specialstring:public string{....} String没有虚构函数,而从没有虚构函数的类进行共有继承是一项禁忌。 Void dosomething (){ Dequespecilalstring*dssp; ..... For_each(dssp.begin,dssp.end,DeleteObjectstring()); 错误很明显了》 直接而安全的做法: Struct DeleteObject{ Templatetypename T Void o
有哪些信誉好的足球投注网站
文档评论(0)