用empty()代替size()==0

对于任意容器c,写下代码:

if(c.size()==0)目的就是判断容器c是否为空,即if(c.empty())。

你可能会奇怪,为什么使用empty()要好于size(),尤其是事实上,empty是一个判断size的内联函数。

选择empty的理由:对于所有标准容器,empty()是一个常数时间操作,而对于一些list实现,size()不保证是一个常数时间操作。why?

list<int> list1;
list<int> list2;
...
list1.splice( list1.end(), list2,find(list2.begin(), list2.end(), 5), find(list2.rbegin(), list2.rend(), 10).base() );

上面的代码是把list2中第一次出现5的位置到最后一次出现10的位置之间连接到list1的尾部。

连接后,list1的size()是多少,只有遍历尾部新插入了多少元素,才能判断出size()大小。

list是唯一不用拷贝元素就能实现把元素高效拼接的容器,用户很可能因为效率而选用list。

但是这就是一个矛盾:让splice()效率更高还是size()更高?

如果在splice()中遍历计算插入的元素的个数,那么size()是一个常数时间,但是splice()的效率就会大打折扣。

如果为了保证splice()的高效,那么就要在调用size()时,去遍历计算插入的个数。

所以尽量还是调用empty()代替size()==0,因为empty()总是常数操作时间。


你可能感兴趣的:(用empty()代替size()==0)