Effective STL 第2、3、4條

第2條:不要試圖編寫獨立於容器類型的代碼

第3條:確保容器中的對象副本正確而高效

       容器中保存了對象,但並不是你提供給容器的那些對象。而當從容器中取出個對象時,你所取出的也並不是容器中所保存的那份。當向容器中加入對象時(通過insert或push_back之類的操作),存入容器的是你所指定的對象的副本。當(通過如front或back之類的操作)從容器中取出一個對象時,你所得到的是容器中所保存的對象的副本。進去的是副本,出來的也是副本(copy in,copy out)。這就是STL的工作方式。

       一旦一個對象被保存到容器中,它經常會進一步被複制。當對vector、string或deque進行元素的插入或刪除操作時,現有元素的位置通常會被移動(複製)。如果你使用下列任何操作——排序算法,next_permutation或previous_permutation,remove、unique或類似的操作,rotate或reverse等待——那麼對象將會被移動(複製)。沒錯,複製是STL的工作方式。

第4條:調用empty而不是檢查size()是否爲0

       對任一容器c,下面的代碼

       if(c.size() == 0)…

本質上與

       if (c.empty())…

是等價的。既然如此,你或許會疑惑爲什麼要偏向於某種形式,尤其是考慮到empty通常被時限爲內斂函數,並且它所做的僅僅是返回size是否爲0。

       你應該使用empty形式,理由很簡單:empty對所有的標準容器都是常數時間操作,而對一些list實現,size耗費線性時間。

       到底是什麼使list這麼討厭呢?爲什麼它不也提供常數時間的size呢?答案在於list所獨有的鏈接(splice)操作

       在這裏,就不再對splice操作做具體的解釋了,有興趣者可以閱讀Effective STL。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章