條目三《確保容器中的副本物件高效而正確》

2022-02-04 03:44:38 字數 1143 閱讀 8566

前兩天看的《海王》,真的真的非常好看,全程無尿點。

在stl中,底層操作的都是容器儲存的物件的副本。也即,對於stl而言,進去和出來都是乙個物件副本。而且在stl的所有操作也只是對儲存物件的副本的移動,刪除等。

有副本的複製行為,證明必定有拷貝建構函式和賦值操作符過載函式的存在。如果我們沒有顯示的宣告定義,編譯器會為我們各自預設的拷貝建構函式和賦值操作符過載函式。

注意點1:

但是由於stl的操作只是對副本的操作,因此編譯器預設生成的只是淺拷貝和淺賦值(賦值,其實沒有所謂的深淺,因為賦值的目的本來就是單純的複製乙份源物件)。

需要特別注意的是拷貝建構函式。對於乙個源物件的拷貝可分為淺拷貝深拷貝。淺拷貝單純拷貝值型別的值,不會對指標指向的記憶體拷貝。如果需要,我們必須自己實現拷貝建構函式。

好了,在這裡,深淺拷貝建構函式不是重點。還是看看如何正確而高效的使用stl的容器操作,畢竟stl的操作都是副本操作。涉及到副本操作,操作不當,就會造成大量的耗時副本複製行為,造成系統效率低下。

注意點2:

< 建立了乙個存放基類物件的容器,向其中插入派生類的物件,那麼在派生類物件(通過基類的複製建構函式)被複製進容器時,它所特有的部分(即派生類中的資訊)將會丟失。

簡單來說,向基類容器插入子類物件,子類物件的特有屬性會丟失。

為了容器高效,儲存的應該是物件的指標而不是物件。畢竟在,在32位架構中,指標固定是4個細節,64位架構也才8個位元組。然而,對於物件而言,即使只有最基本的預設建構函式,析構函式,拷貝建構函式等,已經不止8個位元組了。

所以為了高效,在使用stl容器時,鼓勵是儲存指標而不是物件。因為,在儲存的物件越來越多時,大量的物件複製行為的耗時是可觀的。並且指標沒有深淺拷貝的區別,也沒有剝離問題發生。

注意點3:

但是,在儲存指標的時候,也有煩惱的事情,乙個容易想到的問題是,容器儲存的指標的管理問題,如果在使用時已釋放就會造成coredump。所以乙個好的建議是使用智慧型指標

看起來,stl容器一直在複製和操作副本,相比陣列有什麼優勢?最簡單的是自動擴容,當插入資料時記憶體不夠會自動申請新的記憶體塊並做資料搬移工作。達到有多少公尺吃多少飯的目的,絕不會也不能浪費不必要的記憶體。這是一大進步啊!

第3條 確保容器中的物件拷貝正確而高效

容器中儲存了物件,但並不是你提供給容器的那些物件。而當從容器中取出乙個物件時,你所取出的也並不是容器中所儲存的那份。當向容器中加入物件時,存入容器的是你所指定的物件拷貝。取出物件時,也是拷貝。當然,在存在繼承關係的情況下,拷貝動作會導致剝離。即導致派生類特有的部分丟失 使拷貝動作高效 正確,並防止剝...

DNN容器的物件(用在 html中)

token control description actionbutton 對模組進行各種操作的一般按鈕控制項 contentpane 為模組內容新增乙個佔位符 dropdownactions 簡單的對模組進行操作的下拉列表框 icon 顯示與模組相關的icon linkaction 模組操作的鏈...

去除ArrayList容器中的相同的物件元素

boolean retainall collection c 在網上查到了 retainall方法 然後就在 中新增 listemployeeofintermediarys new arraylist listtemplist new arraylist if templist null emplo...