C++的算符重载
问,都会发生“cache不命中”。在这个特殊的项目中,我们通过将映射从逻辑布局(行,列)变为物理布局(列,行),性能得到了20%的提升。
当然,还有很多这类事情的例子,而稀疏矩阵在这个问题中则是又一类例子。通常,使用operator()方法实现一个稀疏矩阵或交换行/列顺序更容易,operator()方法不会损失什么,而可能获得一些东西——它不会更差,却可能更好。 使用 operator() 方法。 该从外(接口优先)还是从内(数据优先)设计类?从外部! 良好的接口提供了一个简化的,以用户词汇表达的视图。在面向对象软件的情况下,接口通常是单个类或一组紧密结合的类的public方法的集合. 首先考虑对象的逻辑特征是什么,而不是打算如何创建它。例如,假设要创建一个Stack(栈)类,其包含一个 LinkedList:
Stack是否应该有一个返回LinkedList的get()方法?或者一个带有LinkedList的set()方法?或者一个带有LinkedList的构造函数?显然,答案是“不”,因为应该从外向里设计接口。也就是说,Stack对象的用户并不关心 LinkedList;他们只关心 pushing 和 popping。 现在看另一个更微妙的例子。假设 LinkedList类使用Node对象的链表来创建,每一个Node对象有一个指向下一个Node的指针:
LinkedList类是否应该有一个让用户访问第一个Node的get()方法?Node 对象是否应该有一个让用户访问链中下一个 Node 的 get()方法?换句话说,从外部看,LinkedList应该是什么样的?LinkedList 是否实际上就是一个 Node 对象的链?或者这些只是实现的细节?如果只是实现的细节,LinkedList 将如何让用户在某时刻访问 LinkedList 中的每一个元素? 某人的回答:LinkedList 不是的 Node 链。它可能的确是用 Node 创建的,但这不是本质。它的本质是元素的序列。因此,LinkedList 象应该提供一个“LinkedListIterator”,并且“LinkedListIterator”应该有一个operator++ 来访问下一个元素,并且有一对get()/set()来访问存储于Node 的值(Node 元素中的值只由LinkedList用户负责,因此有一对get()/set()以允许用户自由地维护该值)。 从用户的观点出发,我们可能希望 LinkedList类支持看上去类似使用指针算法访问数组的算符:
实现这个接口,LinkedList需要一个begin()方法和end()方法。它们返回一个“LinkedListIterator”对象。该“LinkedListIterator”需要一个前进的方法,++p ;访问当前元素的方法,*p;和一个比较算符,p != a.end()。 如下的代码,关键在于 LinkedList 类没有任何让用户访问 Node 的方法。Node 作为实现技术被完全地隐藏了。LinkedList内部可能用双重链表取代,甚至是一个数组,区别仅仅在于一些诸如 prepend(elem) 和 append(elem)方法的性能上。
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |