Effective STL 第一章 容器(二)

2021-07-09 23:37:50 字數 1163 閱讀 4483

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

1,copy in,copy out是stl的工作方式,即向容器中加入物件時,存入容器的是你指定物件的拷貝,從容器中取出物件時,得到的是容器中所儲存的物件的拷貝。

2,拷貝物件時stl的工作方式,當對vector,string或deque進行元素的插入或刪除操作時,現有元素位置通常會被移動(拷貝)(見第5,14條),如果使用排序演算法(見第31條)如next_permutation,previous_permutation,remove,unique或類似操作(見第32條),rotate或reverse等,物件將會被移動(拷貝)。

3,物件的拷貝通常是利用物件的拷貝成員函式特別是物件的拷貝建構函式和拷貝賦值操作符(見第11,27條),如果沒有宣告這兩個函式,編譯器會宣告;內建型別(如整形,指標型別等)的實現總是簡單的按位拷貝。

4,所以如果向容器中填充物件,而物件的拷貝操作又很費時,那麼填充物件這個簡單的操作就會成為程式的效能瓶頸;而且如果這些物件的拷貝有特殊含義,則將他們放入容器會不可避免的產生錯誤(引起錯誤的一種可能情形見第8條(比如

auto_ptr

,標準規定

auto_ptr

容器(簡稱

coap

)是被禁止的,大多數的

c++編譯器對使用了

auto_ptr

容器的**會編譯報錯,但是某些

stl平台卻沒有完全禁止

coap

,auto_ptr

拷貝後可能產生錯誤的原因是當拷貝乙個

auto_ptr

時,實際上它所指向的物件的所有權將被移交到拷入的

auto_ptr

上,自身被置為

null

,即拷貝乙個

auto_ptr

意味著改變了它的值))

5,若存在繼承關係,拷貝動作會導致剝離(slicing),即如果建立了乙個存放基類物件的容器,卻向其中插入派生類的物件,那麼在派生類物件(通過基類的拷貝建構函式)被拷貝進容器時,它所特有的部分(即派生類中的資訊)將會丟失(更多剝離問題,見第22,38條)

6,使拷貝動作高效,正確,並防止剝離問題發生的乙個簡單辦法是使容器包含指標而不是物件,但指標也會有另外一些問題,見第7,33條,所以智慧型指標可能是個更好的選擇

7,stl總的設計思想是為了避免不必要的拷貝,總體設計目標是為了避免建立不必要的物件

Effective STL 第一章 第9條

第9條 慎重選擇刪除元素的方法 先寫總結,在寫例子 1 要刪除容器中有特定值的所有物件 如果容器是vector,string或deque,則使用erase remove習慣用法 如果容器是list,則使用list remove 如果容器是乙個標準關聯容器,則使用它的erase成員函式 2 要刪除容器...

Effective stl 第一章 第10條

這隔了一星期沒看 看的 感覺好久沒看書 好久沒寫 了 這一不學習就感覺很難進入狀態了 我要收心學習了!收心收心 這一章 沒仔細看 也沒看懂。先記一點 回來再補 第10條 了解分配子 allocator 的約定和限制 最後的總結 1 你的分配子是乙個模板,模板引數t代表你為它分配記憶體的物件的型別。2...

python第一章筆記 第一章 基礎

參與除法的兩個數中有乙個數為浮點數,結果也為浮點數 如 1.0 2,1 2.0,1.0 2.0 python print 1.0 2 結果 0.5 print 1 2.0 結果 0.5 print 1.0 2.0 結果 0.5 整數 整數,計算結果的小數部分被截除,只保留整數部分 不會四捨五入 如 ...