检查矢量是否为空

时间:2010-10-05 11:41:00

标签: c++ stl vector

假设我有std::vectorVector

现在在对矢量执行某些操作(插入或删除)之后,我想检查矢量是否为空,并根据我想要执行某些操作。

哪种方法更好

方法1

if (Vector.size() == 0){ /* operations */ }

方法2

if (Vector.empty()) { /* operations */ }

哪种方法更好,12

8 个答案:

答案 0 :(得分:39)

v.size() == 0说“我正在比较大小”,但这样做是为了检查容器是否为空。在你知道它做什么之前,有一个小的算法要消化(非常小,因为它只包含一个比较) OTOH,v.empty()完全按照它所说的做法:它检查v是否为空 因此,我显然更喜欢#2,就像它说的那样。毕竟,这就是empty()被发明的原因。

但是还有一个算法理由偏好empty():如果有人稍后将std::vector更改为std::list,则v.size() 可能拥有O( N)。 (在C ++ 03中,std::vector保证为O(1),但std::list保证不是。{根据James对Prasoon's answer的评论,对于,它将是O(1) C ++ 1x中的所有容器。)

答案 1 :(得分:8)

方法(2)会更好,因为empty()总是在一个恒定的时间内运行[即O(1)],而不管容器类型如何。

size()也在O(1) [for std :: vector]中运行,尽管它可能在O(n)中运行std:list [实现定义为诚实]

Effective STL [项目4]中,Scott Meyers说

  

您应该更喜欢使用empty的构造,原因很简单:empty是所有标准容器的常量操作,但对于某些列表实现,   大小需要线性时间。

     

.....

     

无论发生什么,如果你打电话给空而不是检查,你就不会出错   看看size()== 0.因此,只要你需要知道容器是否有,就调用空   零元素。

答案 2 :(得分:8)

我会说方法为2,因为方法empty()被故意设计为检查向量是否为空。您也可以检查两种方法的效率,然后确定哪种方法更好。

答案 3 :(得分:3)

通常,向量在内部实现为指向动态分配数组的指针,数据成员持有向量的capacitysize。向量的size是元素的实际数量,而容量是指动态数组的大小。

鉴于此实现,成员函数size()将只是成员size的获取者。

empty()将返回比较结果size == 0

因此,两者同样有效O(1),但如果要检查向量是否为空,则推荐给empty()。因为这就是功能所在。这将使您的代码更易于阅读。

答案 4 :(得分:2)

如果您不熟悉编程,请使用对您有更多意义的编程。例如,如果== 0对你来说比.empty()更有意义,那就使用它。

稍后,如果您遇到性能问题(我强烈怀疑您将会遇到此问题),请使用满足您性能目标的问题。

答案 5 :(得分:2)

实际上,vector.empty()和vector.size()== 0正在做同样的事情。  empty比较开头和结尾,如果它们相同则返回true,size计算begin - end因此返回0,如果它是空的,那么使用另一个计算做同样的事情。

答案 6 :(得分:1)

只是为了好玩:为什么不:

if(Vector.begin() == Vector.end())

答案 7 :(得分:0)

去空()。