size 0和empty 的比較

2021-06-25 23:30:04 字數 2177 閱讀 6920

最近開發公司專案的時候發現大量用到了stl模板庫,而且很多地方都需要判斷乙個容器是否為空,看到了兩種寫法,分別使用了容器的 size() 函式和 empty()函式。

我覺得很好奇,這兩種寫法有什麼區別呢?在網上查閱了一些資料,發現說empty()效率更高的佔大多數。又檢視了sgi stl的幫助文件,裡面有一句話:

ifyou are testing whether a container is empty, you should always write c.empty()instead of c.size() == 0. the two expressions are equivalent, but the formermay be much faster.

大致上的意思就是在檢測容器是否為空的時候,推薦用empty()代替使用size() == 0,兩者的含義是相等的,但是前者可能會更快一些。

之後又在stackoverflow上看到有人提了乙個類似的問題,並且貼出了stl的實現原始碼:

bool empty()const

這就讓我更詫異了,這樣的話empty()會比size() == 0更高效嗎?

實踐是檢驗真理的唯一標準,那麼我們就親自來測試一下吧。

為了公平起見,也為了測試方便,我分別在兩個平台上進行測試,分別是aix5.3以及centos6.5。

由於容器的內部實現的不同,我們測試三種比較典型也用的較多的容器:vector、list以及map。

測試的**如下,因為**基本上差別不大,這裡只貼一下測試vector的**:

#include #include #include #include using namespace std;

class a

;int main()

bool empty() const

可以看出aix上vector的empty()函式實際上是呼叫了size()函式進行判斷,size()函式返回的是表示當前容器數量的乙個變數,所以,顯然,size() == 0的效率是要高於empty()的,因為少了函式呼叫部分的耗時。

size_type size() const

bool empty() const

這裡size()是尾指標減去頭指標得到的,而empty()是比較頭指標和尾指標是否相等。在empty()裡多了函式呼叫以及臨時變數賦值等操作。

size_type size() const

bool empty() const

aix上對於在list中的處理方式依然和vector一樣,維護了乙個_size變數,empty()多了一層函式呼叫,效率較低。

size_type size() const

bool empty() const

size()函式呼叫了distance函式用遍歷的方法取得兩個指標間的元素個數,然後返回。而empty()函式則是判斷頭指標的下乙個節點是否是自己本身,只需要進行一次判斷。所以,當list容器元素個數較多的時候,這裡的empty()效率遠大於size() == 0。

size_type size() const

bool empty() const

不出意外,可以看出aix上依然維護了乙個_size變數,在判斷的時候都是用這個變數來判斷,但是empty()多了一層函式呼叫,所以效率上會稍微低一些。

bool empty() const

size_type size() const

這裡的map用到了紅黑樹,就不詳細解釋了,有興趣的同學可以自己查閱相關資料。**中empty()和size()用到的都是儲存紅黑樹的節點數的變數,可以看出empty()和size() == 0兩者其實是等價的。

並不是所有的時候用empty()的效率都比size() == 0要高。

例如在aix上,由於所有的容器都維護了乙個儲存元素個數的值,呼叫size()的時候直接返回,而呼叫empty()的時候還是要去呼叫size()函式,所以會多一次函式呼叫的開銷。在aix上,顯然使用size() == 0替代empty()將會使程式效率更高。

而在centos上,由於stl原始碼的實現方式不同,需要考慮到使用的容器,不同的容器呼叫size()和empty()的開銷也不同,但是,相對來說,使用empty()的效率更加平均,例如在使用list容器的時候,如果資料量較大,size()的開銷太大,而empty()則不會出現這種極端情況。

如果考慮到平台遷移等等將來可能出現的狀況,顯然,empty()比size() == 0更加合適,可以確保你的程式不會出現太大的效能問題。

欄位和屬性 列表Size 0和null的區別

類成員包括變數和方法。如果希望其他類能夠訪問成員變數的值,就必須定義成公有的,而將變數設為公有public,那這個成員變數的就可以被任意訪問 包括修改,讀取 這樣不利於資料安全。c 通過屬性特性讀取和寫入字段 成員變數 而不直接直接讀取和寫入,以此來提供對類中字段的保護。屬性可用於類內部封裝字段。屬...

empty 和size 的優劣

通常下面 if c.size 0 if c.empty 我們會覺得它們是是等價的。主要是他們之間的效率有一定差距 bool empty const list的empty操作 而size 則是通過區間遍歷來數一數。如果size 想在常數時間內實現,那麼每個操作都要維護size的值。splice 的特點...

比較empty()與 isset()d的區別

比較empty 與 isset 的區別 注意 empty 在php5.5之前只能檢測變數 isset 只能檢測變數 兩者之間的聯絡 empty var 等價於 isset var var false 比較empty與isset的區別 empty 檢測變數是否為空或者是否存在 如果變數為空,或者不存在...