为什么“(!v.empty())”比“(v.size()> 0)”更好?

时间:2018-10-08 08:19:03

标签: c++

我在教程中读到说:

bool is_nonempty_notgood = (v.size() > 0); // Try to avoid this
bool is_nonempty_ok = !v.empty();

我无法理解的解释:

首先,size()是未签名的,有时可能会导致问题;

第二,如果您想知道容器是否为空,则不建议将v.size()与零进行比较。这是因为并非所有容器都可以在O(1)中报告其大小,因此绝对不应该只为了确保包含至少一个元素而对双重链接列表中的所有元素进行计数。

有人可以提供一些例子和更多细节吗?

2 个答案:

答案 0 :(得分:4)

bool is_nonempty_notgood = (v.size() >= 0); // Try to avoid this

应该是>,而不是>=

  

首先,size()是无符号的,有时可能会导致问题;

大小是否为未签名是C / C ++中经常出现的主题,请参见例如Why is size_t unsigned?

通常,无符号整数有一些陷阱。如果您不想处理这些,只需使用带符号的整数(无论是否为大小)即可。

  

第二,如果要知道容器是否为空,将v.size()与零进行比较不是一个好习惯,这是因为并非所有容器都可以在O(1)中报告其大小,因此您肯定不应仅仅为了确保包含至少一个元素就对一个双链表中的所有元素进行计数。

想象一下,我给你一个甲板。一眼就能知道里面至少有一张卡(!v.empty()),对吗?

但是,如果我要您确切地计算其中有多少张卡牌(v.size()),这将需要您一段时间。

答案 1 :(得分:1)

对于某些容器,size()可能是O(N)遍历,而empty()可能是 O O(1)。但请注意,C ++ 11及更高版本要求所有 standard 容器的size() empty()均为O(1)。

因此,如果您想编写与容器无关的代码,请尽可能empty()

最后要不要size() > 0