《C 標準程式庫》讀書筆記

2021-06-08 04:04:03 字數 2164 閱讀 7616

泛型

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所擁有...