codecamp

C++ 子牌堆

我们应该如何表示一手牌或者一副牌的某个子集呢?很容易的选择就是创建一个少于52张纸牌的Deck对象。

我们可能需要一个subdeck函数,它以一个纸牌向量和索引的区间为参数,返回值是一个新的向量,其中包括了牌堆中指定的子集:

Deck Deck::subdeck (int low, int high) const {
  Deck sub (high-low+1); 

  for (int i = 0; i<sub.cards.length(); i++) {
    sub.cards[i] = cards[low+i];
  }
  return sub;
}

我们使用Deck的构造函数创建局部变量subdeck(译者注:参考代码,这里应该是sub,下同),其参数为牌堆大小,这里没有对其中的纸牌进行初始化,其初始化是通过复制原始牌堆中的纸牌完成的。

subdeck的长度是high-low+1,因为区间下界和上界的牌都包括在其中。这个计算虽然简短但还是容易让人迷惑,进而导致“差一错误”。要避免这种错误,最好通过画图来辅助理解。

作为练习,请编写另一个版本的findBisect函数,它以一个子牌堆为参数,而不是以一个牌堆和索引区间为参数。哪个版本更容易出错?你认为哪个版本会更高效?

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; }