codecamp

C++ 牌堆与子牌堆

请看函数findBisect的接口:

int findBisect (const Card& card, const apvector<Card>& deck,int low, int high) {

把三个参数deck,low和high看作指定一个子牌堆的单一参数是可以说得通的。

这种事情很常见,有时我把它当作抽象参数。所谓”抽象“,我指的是在更高层次上描述函数,并非程序代码的字面意思。

例如,当以向量以及用以限界的low和high为参数调用函数时,其实根本没办法限制函数中访问界限之外的元素。所以我们并没有像字面上说的那样传递了子牌堆,但是只要被调函数按规矩办事, 抽象的将参数当做子牌堆是有意义的。

还有一个例子,你可能已经注意到了,在9.3节,我提到“空”数据结构时也用到了这种抽象。“空”上的引号就是为了提醒读者,这并非是字面意义上真正的空。所有的变量自始至终都是有值的。创建变量之时,它们会有默认值。所以没有空对象这样的东西。

但是,如果程序确保变量的当前值在写之前从未被读过,则当前值是无意义的值。抽象地讲,把这种变量当做”空“值是说得通的。

这种思考方式——即程序带上了超出编码字面意思之外的意义——是像计算机科学家一样思考问题的一个重要部分。有时,”抽象“这个词用的太多、太杂,可能难以解释。尽管如此,抽象仍然是计算机科学(以及很多其他领域)的一个中心思想。

“抽象”的一个更一般的定义是“为了抓住重要行为且抑制不必要的细节,使用简单的描述建模复杂系统的过程”。

C++ 二分查找
C++ 枚举类型
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }