C 的风格与的技巧 2.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C 的风格与的技巧 2

C 的风格与技巧 【2】 既然已经有了优秀的qsort()函数,为什么还需要一个sort()? 对于初学者来说, qsort(array,asize,sizeof(elem),elem_compare); 看上去太古怪了,而且比这个更难理解: sort(vec.begin(),vec.end()); 对于专家来说,在元素与比较方式(comparison criteria)都相同的情况下,sort()比qsort()更快,这是很重要的。而且,qsort()是通用的,所以它可以用于不同容器类型、元素类型、比较方式的任意有意义的组合。举例来说: struct Record{ string name; //. }; struct name_compare{//使用name作为键比较Record bool operator()(const Recorda,const Recordb)const {return a.name b.name;} }; void f(vector Recordvs) { sort(vs.begin(),vs.end(),name_compare()); //. } 而且,很多人欣赏sort()是因为它是类型安全的,使用它不需要进行造型(cast),没有人必须去为基本类型写一个compare()函数。 更多的细节,参见我的文章《将标准C++作为一种新的语言来学习》(Learning C++as aNew language),可以从我的文章列表中找到。 sort()胜过qsort()的主要原因是,比较操作在内联(inlines)上做得更好。 什么是函数对象(function object)? 顾名思义,就是在某种方式上表现得象一个函数的对象。典型地,它是指一个类的实例,这个类定义了应用操作符operator()。 函数对象是比函数更加通用的概念,因为函数对象可以定义跨越多次调用的可持久的部分(类似静态局部变量),同时又能够从对象的外面进行初始化和检查(和静态局部变量不同)。例如: class Sum{ int val; public: Sum(int i):val(i){} operator int()const{return val;}//取得值 int operator()(int i){return val+=i;}//应用 }; void f(vector v) { Sum s=0;//initial value 0 s=for_each(v.begin(),v.end(),s);//求所有元素的和 coutthe sum iss\n; //或者甚至: coutthe sum isfor_each(v.begin(),v.end(),Sum(0))\n; } 注意一个拥有应用操作符的函数对象可以被完美地内联化(inline),因为它没有涉及到任何指针,后者可能导致拒绝优化。与之形成对比的是,现有的优化器几乎不能(或者完全不能?)将一个通过函数指针的调用内联化。 在标准库中,函数对象被广泛地使用以获得弹性。 我应该如何对付内存泄漏? 写出那些不会导致任何内存泄漏的代码。很明显,当你的代码中到处充满了new操作、delete操作和指针运算的话,你将会在某个地方搞晕了头,导致内存泄漏,指针引用错误,以及诸如此类的问题。这和你如何小心地对待内存分配工作其实完全没有关系:代码的复杂性最终总是会超过你能够付出的时间和努力。于是随后产生了一些成功的技巧,它们依赖于将内存分配(allocations)与重新分配(deallocation)工作隐藏在易于管理的类型之后。标准容器(standard containers)是一个优秀的例子。它们不是通过你而是自己为元素管理内存,从而避免了产生糟糕的结果。想象一下,没有string和vector的帮助,写出这个: #include vector #include string #include iostream #include algorithm using namespace std; int main()//small program messing around with strings { coutenter some whitespace-separated words:\n; vector string v; string s; while(cin s)v.push_back(s); sort(v.begin(),v.end()); string cat; typedef vector string:const_iterator Iter; for(Iter p=v.begin();p!=v.end();++p)cat+=*p++; cout cat\n; } 你有

您可能关注的文档

文档评论(0)

3471161553 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档