C++ 牌堆与子牌堆
请看函数findBisect的接口:
int findBisect (const Card& card, const apvector<Card>& deck,int low, int high) {
把三个参数deck,low和high看作指定一个子牌堆的单一参数是可以说得通的。
这种事情很常见,有时我把它当作抽象参数。所谓”抽象“,我指的是在更高层次上描述函数,并非程序代码的字面意思。
例如,当以向量以及用以限界的low和high为参数调用函数时,其实根本没办法限制函数中访问界限之外的元素。所以我们并没有像字面上说的那样传递了子牌堆,但是只要被调函数按规矩办事, 抽象的将参数当做子牌堆是有意义的。
还有一个例子,你可能已经注意到了,在9.3节,我提到“空”数据结构时也用到了这种抽象。“空”上的引号就是为了提醒读者,这并非是字面意义上真正的空。所有的变量自始至终都是有值的。创建变量之时,它们会有默认值。所以没有空对象这样的东西。
但是,如果程序确保变量的当前值在写之前从未被读过,则当前值是无意义的值。抽象地讲,把这种变量当做”空“值是说得通的。
这种思考方式——即程序带上了超出编码字面意思之外的意义——是像计算机科学家一样思考问题的一个重要部分。有时,”抽象“这个词用的太多、太杂,可能难以解释。尽管如此,抽象仍然是计算机科学(以及很多其他领域)的一个中心思想。
“抽象”的一个更一般的定义是“为了抓住重要行为且抑制不必要的细节,使用简单的描述建模复杂系统的过程”。