effective STL 某個Item裡重點提出了 list.size()是一個O(n)的效率 當時只是記下來了 後面看了csdn有人在實際工程上遇到坑了 我近來閒來無事 把STL的list相關部分好好看下:
看看STL大牛們設置成O(n)的原因:
1) size() 調用algorithm裡的distance() 得出長度 而empty()就是判斷頭和尾是否相等 O(1) 大部分情況下 咱們都是判斷這個list是否為空
2) 設計原因: list引入了一個重要的splice操作,在常量級別也就是o(1)完成list的tranfer 這個操作對merge reverse sort有很大的幫助 如果:
size()不這樣做 那麼tranfer就不能是o(1)完成 不是o(1) 那麼就在Merge 和sort就不能高效完成 而且事實上 merge 和sort操作顯的更為重要些,所以size()在每次調用時調用distance 而不是更好的O(1) 這樣就可以均攤tranfer的常量級操作 看到網上人吐槽這個地方 我想懂了上述設計原理 也不會吐槽這個結構了。
一個宏定義,宏的名稱是list_init_size,它的值是80
相當於一個常量.後面程序中只要用到list_init_size,那麼它的值都是80
當然有區別。舉個不算恰當的例子,我有一個空著的水杯(list),而你沒有,那你是null,我的size為0。你想裝水需要去買個水杯(new ArrayList();),我就可以直接裝水(list.add(水))。你要是直接裝,水就流出去啦(空指針異常)。所以用做判斷的時候經常連用 list!=null && list.size()!=0 。