- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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;
}
你有
您可能关注的文档
- “眼球对眼球的权利”——对质权制度比较研究_民法论文_法律论文__5414.doc
- “铁屋子”或“家”的民族寓言——论中国电影的一个原型叙事结构及其变形_电视电影论文_艺术论文__4563.doc
- 《催醒术》——1909年发表的“狂人日记”_现当代文学论文_文学论文__264.doc
- 《春望》五种英译文的比较研究,英语翻译学论文-_3168【论文全集】.doc
- “整理国故运动”与国学研究的学科重建_国学论文_哲学论文__3348.doc
- 侦查程序的正当化是我国法治建设发展的需要,侦查论文-_182【论文大全】.doc
- 从文化视角研究《红楼梦》中委婉语的翻译,英语翻译学论文-_194【论文大全】.doc
- 中国左翼文学、京海派文学及其在当下的意义_现当代文学论文_文学论文__195.doc
- 信息技术与教育相整合的进程,教育管理论文.doc
- 大学语文课程建设的一些建议,语文教育论文-_577【论文大全】.doc
- 2026年中国陵园墓地市场调研及投资前景评估.docx
- 2026年中国礼品行业分析报告-产业规模现状与未来规划分析(目 录).docx
- 2026年中国罗茨泵行业市场专项调研及投资前景可行性预测报告.docx
- 2026年中国陵园墓地市场规模现状分析及十五五投资价值评估报告 - 副本 - 副本 (3) - 副本.docx
- 2026年中国磷灰石现状研究及发展趋势预测.docx
- 2026中国船舶集团第七一一研究所校园招聘备考题库含答案详解(培优b卷).docx
- 2026年中国淋浴房行业市场调研与未来发展策略咨询报告(定制版).docx
- 2026年中国磷化铟市场运营态势研究报告.docx
- 2026中国绿发投资集团有限公司高校毕业生招聘测评备考题库附答案详解(培优a卷).docx
- 2026年中国脉冲测量模块产业发展现状及市场监测报告.docx
原创力文档


文档评论(0)