[C++] 判断标准库容器非空与否请用 empty(),判断容器元素个数才用 size()

陪她去流浪 桃子 2016年05月18日 编辑 阅读次数:4398

翻阅以前的代码,时常会看到如下代码:

1
2
3
4
if(str.size() == 0) {}
if(!vec.size())     {}
if(!list.size())    {}
// ......

这些例子中只是把 size() 的返回值简单地进行布尔逻辑比较,意思是判断容器空与非空。代码没有逻辑问题,只是不够友好。

在C++的标准库容器中都有一个 empty() 方法,返回布尔值,表明容器当前是否为空。我一直觉得这么名字容易让人会错意,因为 empty 一词既有空的(形容词,改成 is_empty() 是否妥当一些?)之意,又有清空(动词)之意。不过,就算有歧义,但只要使用的时候统一就好了,标准库做到了这一点。

使用 size() 判断容器非空与否的不好之处在于:某些标准库中的实现中对某些容器的 size() 求值操作不是线性的。

比如 std::list<>,在某些实现中,每一次调用 size() 都会遍历整个 list 来求 size,这会带来一定的性能问题。如果是线性容器则不会有此问题。

总之,如果只是想判断空与非空,则应总是使用 empty(),而不是 size()

标签:C++