提问人:XI JING 提问时间:5/1/2022 最后编辑:XI JING 更新时间:5/1/2022 访问量:234
如何检查程序是否为空?
How do I check if the program cout is empty?
问:
我遇到了一个问题,我有一个 void 函数,它使用无序遍历打印出 AVL 树节点值。但是,如果 void 函数没有任何 cout,我还需要打印出“EMPTY”。
而且由于 void 函数是递归的,所以我假设 不能在函数内部(实际上我尝试过,但产生了很多不必要的 EMPTY)。
我的问题是,有没有办法检查程序/函数 cout,如下所示: if(cout is empty){ print “EMPTY” }cout << "EMPTY" << endl;
void inorder(node* n){
if(n != NULL){
inorder(n->left);
cout << n->value << ' ';
inorder(n->right);
}
}
答:
您无法查询它是否打印了某些内容。实际上有一个方法(tellp())可以返回 std::basic_ostream 流的位置(就是这样),但是当调用时总是返回 -1,可能是因为没有跟踪它打印的字符数(也就是它在输出流中的“位置”)。cout
cout
cout
cout
因此,知道某些内容是否被打印的唯一实用方法是检测您的函数以通过返回值(正如 Retired Ninja 在评论中建议的那样)或通过其他机制(例如写入引用参数,或设置全局变量等)向调用者提供该信息inorder()
当您调用 时,当且仅当其参数不是 时,它才保证产生一些输出。所以你可以这样做:inorder
NULL
void inorderTraverse(node* n)
{
if (n == NULL)
std::cout << "EMPTY" << std::endl;
else
inorder(n);
}
然后,无论您第一次打电话到哪里,都要打电话。inorder
inorderTraverse
评论
EMPTY
inorder
执行此操作的方法是具有两个函数:
- 一个用户调用的,如果树是空的,它将打印“EMPTY”
- 一个做其他一切的事情
执行此操作的常见方法是使用“detail”命名空间,但任何其他具有帮助程序函数的方法也可以:
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";
}
}
不过,我个人不喜欢标志代码——帮助程序函数是一个古老的、可识别的习惯用语,它避免了每个叶节点的布尔测试的开销。
评论
inorder
EMPTY