假设我有std::vector
发言权Vector
现在在对向量(插入或删除)执行某些操作之后,我想检查向量是否为空,并且基于此我想要执行某些操作.
哪种方法更好
方法1
if (Vector.size() == 0){ /* operations */ }
Run Code Online (Sandbox Code Playgroud)
方法2
if (Vector.empty()) { /* operations */ }
Run Code Online (Sandbox Code Playgroud)
哪种方法更好,1
还是2
?
sbi*_*sbi 40
v.size() == 0
说"我正在比较大小",但这样做是为了检查容器是否空了.在你知道它的作用之前,有一个小的算法要消化(非常小,因为它只包含一个比较).
OTOH,v.empty()
完全按照它说的做法:它检查是否v
为空.
因此,我显然更喜欢#2,就像它说的那样.empty()
毕竟,这就是为什么被发明的原因.
但是还有一个算法理由要优先考虑empty()
:如果有人后来std::vector
改为a std::list
,v.size()
可能会有O(n).(在C++ 03中,它保证为O(1)std::vector
,但不是std::list
.根据James对Prasoon的回答,对于C++ 1x中的所有容器,它将是O(1).)
方法(2)
会更好,因为无论容器类型如何,empty()
总是以恒定时间运行[即O(1) ].
size()
也运行在O(1)
[性病::矢量]尽管它可能运行O(n)
于std:list
[这就是实现定义说实话]
在Effective STL
[项目4]斯科特迈尔斯说:
您应该更喜欢使用empty的构造,原因很简单:empty是所有标准容器的常量操作,但对于某些列表实现,size需要线性时间.
.....
无论发生什么,如果你调用空而不是检查size()== 0,你就不会出错.所以每当你需要知道一个容器是否有零元素时,都要调用空.
我会说approch没有2,因为方法empty()被故意设计来检查向量是否为空.您还可以检查两种方法的效率,然后确定哪种方法更好.