泛型
why泛型:為了讓庫更一般化。比如find,可以將三樣東西都引數化
1)查詢物件的型別
2)該物件在資料結構中的組織方式
3)滿足某某條件地查詢
仿函式p127,294
what仿函式:定義了operator()的物件
why仿函式:
1)使泛型演算法更一般化
2)仿函式有自己的獨特狀態
仿函式可以有不同的狀態。所以可以產生多個函式實體。
並且,可以在執行時被呼叫之前呼叫它們
3)仿函式有自己的獨特型別
每個仿函式都有其型別。因此你可以將仿函式的型別當做template引數來傳遞。
此外,容器型別也會因為仿函式的不同而不同
4)執行速度上,仿函式通常比函式指標更快
5)如果用函式指標,不能滿足stl對抽象性的要求,也不能滿足軟體積木的要求——函式指標無法和stl其他元件(如配接器adapter)搭配,產生更靈活的變化
when仿函式:
排序準則、搜尋準則,定義某種操作
函式配接器
(function adapters)p306
what函式配接器:將仿函式和另乙個仿函式(或某個值,或某個一般函式)結合起來的仿函式
函式配接器本身也是仿函式,故可以結合仿函式以形成更強大更複雜的表示式
why函式配接器:通過它們之間的繫結、組合、修飾能力,幾乎可以無限制地創造出可能的表示式,搭配stl演算法一起演出
bind1st(op,value)
bind2nd(op,value)
not1(op)
not2(op)
when vector
迭代器失效
1)vector重新分配空間
迭代器之配接器
(interator adapters)
what 迭代器之配接器:具有迭代器介面,卻有著不同的行為
1) insert iterators
2) stream iterators
3) reverse iterator
insert迭代器p271
what inserts迭代器:用來將元素值插入容器內的一種迭代器。用來將「賦值新值」操作轉換為「安插新值」操作。通常這種迭代器,演算法可以執行安插行為而非覆蓋行為。
如果向inserts迭代器賦予乙個元素值,你其實就是將它插入到容器內。如果寫入第二個值,並不會覆蓋第乙個值,而是將值安插進去
intia=;
dequeid(ia,ia+6)
copy(ia+1,ia+3,front_inserter(id))
front_inserter,back_inserter,insert都是用來將容器封裝為乙個back_insert_iterator(x)類,內部儲存乙個容器類x的指標,賦值操作被容器的push_back,push_front,insert等成員函式取代 p271
inserts迭代器
1)operator*被實作為乙個無實際動作的動作(no-op),只是簡單傳回*this。所以,對insert迭代器來說,*pos與pos等價
2)遞增運算操作符也被實作為乙個no-op(無動作)也是簡單傳回乙個*this
3)賦值動作被轉化為安插操作。事實上insert迭代器會呼叫容器的push_back(),push_front()或insert()成員函式
p274
使用inserts迭代器時,一定要在呼叫copy()之前確保有足夠大的空間。因為back_inserter在安插元素時,可能會造成容器的其他迭代器失效。因此,如果不保留足夠空間,這個演算法可能會形成「源端迭代器失效」狀態(源空間,和目標空間都是同一容器時)
when使用inserts迭代器前需注意的問題
1)容器是否支援操作(比如vector不支援push_front,所以不能用front_inserter)
2)呼叫copy之前要確保有足夠大的空間(源空間,和目標空間都是同一容器時)
《C 標準程式庫》讀書筆記(一)
1,很多編譯器都要求模板的定義和實現都在標頭檔案中,這是因為必須先為他提供某個實現品,然後才能呼叫,也只有如此才能通過編譯。目前唯一能讓 template 的運用 具有可移植性的方式,就是在標頭檔案中以 inline function 實現temlate function。2,下面typename ...
《C 標準程式庫》讀書筆記(一)
1,很多編譯器都要求模板的定義和實現都在標頭檔案中,這是因為必須先為他提供某個實現品,然後才能呼叫,也只有如此才能通過編譯。目前唯一能讓 template的運用 具有可移植性的方式,就是在標頭檔案中以inline function實現temlate function。2,下面typename指出su...
《C 標準程式庫》讀書筆記(二)
1,下面這段 會引起異常 因為所有權已經轉移 而通過 by reference 方式傳遞 auto ptr 更是糟糕的 若改為 const auto ptr p new int 則會在編譯時提示錯誤.因此我們可以通過常數型auto ptr來終結所有權轉移,它並不是表示你不能更改auto ptr所擁有...