要检查堆栈是否为空,我们可以使用if(stack.size())
。那为什么我们有stack.empty()
是否存在这些结果可能不同的情况,或者使用其中一个结果比使用另一个结果有任何优势。
在某种程度上,这是风格的选择。
就我个人而言,我认为依赖隐式布尔转换应该局限于具有类似指针语义的东西:实际指针、智能指针、std::optional
出现在脑海中。在这种情况下,它无处不在,感觉很自然。
在其他情况下,这感觉很奇怪。尽可能清楚地传达你的意图!在我看来,if(!stack.empty())
比if(stack.size())
更清楚、更直接地传达意图。
然而,风格并不是故事的全部。如果使用size样式作为一般规则,则这可能会成为性能问题,因为您同时依赖size()
和empty()
的速度。
想象一个不存储其大小的链表类型。它的empty()
函数仍然很快,因为它相当于检查一个指针。但它的size()
必须遍历整个列表才能确定项目的数量。这可能是一个更昂贵的操作。