检查矢量是否为空

Pra*_*rav 37 c++ stl vector

假设我有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).)


Pra*_*rav 8

方法(2)会更好,因为无论容器类型如何,empty()总是以恒定时间运行[即O(1) ].

size()也运行在O(1)[性病::矢量]尽管它可能运行O(n)std:list[这就是实现定义说实话]

Effective STL[项目4]斯科特迈尔斯说:

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

.....

无论发生什么,如果你调用空而不是检查size()== 0,你就不会出错.所以每当你需要知道一个容器是否有零元素时,都要调用空.

  • 不,`size()`几乎可以保证为O(1),特别是对于`vector`.在C++ 0x中,对于任何实现它的容器,`size()`都需要为O(1). (3认同)

Kat*_*nis 8

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

  • `empty`方法特别适合`std :: list`s,因为计算它们的大小可能非常长. (5认同)