假设我有std::vector
说Vector
现在在对矢量执行某些操作(插入或删除)之后,我想检查矢量是否为空,并根据我想要执行某些操作。
哪种方法更好
方法1
if (Vector.size() == 0){ /* operations */ }
方法2
if (Vector.empty()) { /* operations */ }
哪种方法更好,1
或2
?
答案 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)
通常,向量在内部实现为指向动态分配数组的指针,数据成员持有向量的capacity
和size
。向量的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)
去空()。