我面臨一個問題,我有一個 void 函式,它使用中序遍歷列印出 AVL 樹節點值。但是,如果 void 函式沒有任何 cout,我還需要列印出“EMPTY”。
而且由于 void 函式是遞回的,所以我假設cout << "EMPTY" << endl;
不能在函式內部(實際上我嘗試了但產生了很多不必要的 EMPTY)。
我的問題是有什么方法可以檢查程式/函式 cout,例如: if(cout is empty){ print "EMPTY" }
void inorder(node* n){
if(n != NULL){
inorder(n->left);
cout << n->value << ' ';
inorder(n->right);
}
}
uj5u.com熱心網友回復:
您無法查詢cout
它是否列印了某些內容。實際上有一個方法(tellp())回傳std::basic_ostream流的位置(這是什么cout
),但是當被呼叫時cout
總是回傳 -1,大概是因為cout
沒有跟蹤它的字符數已列印(也就是它在輸出流中的“位置”)。
因此,了解是否列印了某些內容的唯一實用方法是inorder()
通過回傳值(如 Retired Ninja 在評論中建議的那樣)或通過其他一些機制(例如,寫入 by- 來向呼叫者提供該資訊的函式)參考引數,或設定全域變數等)
uj5u.com熱心網友回復:
當您呼叫 時inorder
,當且僅當其引數不是時,才能保證產生一些輸出NULL
。所以你可以這樣做:
void inorderTraverse(node* n)
{
if (n == NULL)
std::cout << "EMPTY" << std::endl;
else
inorder(n);
}
然后,無論您第一次打電話inorder
,還是打電話inorderTraverse
。
uj5u.com熱心網友回復:
做到這一點的方法是有兩個功能:
- 用戶呼叫的一個,如果樹為空,它將列印“EMPTY”
- 做其他所有事情的人
執行此操作的常用方法是使用“詳細”命名空間,但任何其他具有輔助函式的方法也可以使用:
namespace detail{
void inorder(node* n){
if(n != NULL){
inorder(n->left);
std::cout << n->value << ' ';
inorder(n->right);
}
}
}
void inorder(node* n){
if(n) detail::inorder(n);
else std::cout << "EMPTY";
}
執行此操作的另一種常見方法是使用附加的默認引數(在本例中為布林值)來指示它是否是頂級呼叫:
void inorder(node* n, bool is_top=true){
if (n != NULL){
inorder(n->left, false);
std::cout << n->value << ' ';
inorder(n->right, false);
}else if(is_top){
std::cout << "EMPTY";
}
}
不過,我個人不喜歡標志性的代碼——幫助函式是一個古老的、可識別的習慣用法,并且避免了在每個葉節點上進行布爾測驗的開銷。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/470932.html
上一篇:函式遞回