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

2021-08-29 15:40:07 字數 1491 閱讀 2467

1,下面這段**會引起異常

,因為所有權已經轉移

,而通過

by reference

方式傳遞

auto_ptr

更是糟糕的

若改為:const auto_ptr p(new

int);則會在編譯時提示錯誤.因此我們可以通過常數型auto_ptr來終結所有權轉移,它並不是表示你不能更改auto_ptr所擁有的物件,而是不能更改auto_ptr的擁有權,就此特性而言,它比較類似常數指標,而不是指向常數的指標.

template

<

typenamet

>

void

bad_print(auto_ptr

<

t>

p)int

main(

intargc,

char

*argv)

2,auto_ptr之間不能共享擁有權,乙個auto_ptr不能指向另乙個auto_ptr所擁有的物件,否則當乙個指標刪除該物件後,就糟糕了.auto_ptr不能指向陣列,因為它是通過delete而不是delete來釋放其所擁有的物件.它也不是乙個引用計數型指標.因為在拷貝和賦值後,原來的auto_ptr和新產生的auto_ptr並不相等,而是原auto_ptr會交出擁有權,而不是拷貝給新auto_ptr,因此也不要將auto_ptr作為標準容器的元素.

3,下面過載的輸出運算子的第二個引數是乙個const reference,所以並沒有發生擁有權的轉移.

template

<

class

t>

ostream

&operator

<<

(ostream

&strm,

const

auto_ptr

<

t>&

p)else

return

strm;}

4,容器可分為兩類:1)序列式容器,這是ordered collection,每個元素都有固定位置,取決於插入時機和地點,和元素值無關.它們是:vector,deque,list;2)關聯式容器.這是sorted collection,元素位置取決於特定的排序準則,它們是:set,multiset,map,multimap.

關聯式容器自動對其元素排序,並不意味著它們就是用來排序的,這只迭是它的乙個***而已.

5,每個容器將其迭代器以巢狀的方式定義於內部,因此各種迭代器的介面相同,型別卻不同.迭代器有以下兩種型別:1)雙向迭代器.可以雙向行進:以遞增運算前進或以遞減運算後退,list,set,multiset,map和multimap提供的迭代器都是此類.2)隨機訪問迭代器.不僅具備雙向迭代器的所有屬性,還具備隨機訪問能力.它們提供了」迭代器算術運算」必要的操作符.可以對迭代器增加或減少乙個偏移量,處理迭代器之間的距離,或是使用《和》之類的相對關係操作符來比較兩個迭代器.vector,deque和strings所提供的迭代器都屬於此類.為了寫出盡可能與容器型別無關的泛型程式**,最好不使用隨機訪問迭代器的特有操作.

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

泛型 why泛型 為了讓庫更一般化。比如find,可以將三樣東西都引數化 1 查詢物件的型別 2 該物件在資料結構中的組織方式 3 滿足某某條件地查詢 仿函式p127,294 what仿函式 定義了operator 的物件 why仿函式 1 使泛型演算法更一般化 2 仿函式有自己的獨特狀態 仿函式可...

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

1,很多編譯器都要求模板的定義和實現都在標頭檔案中,這是因為必須先為他提供某個實現品,然後才能呼叫,也只有如此才能通過編譯。目前唯一能讓 template 的運用 具有可移植性的方式,就是在標頭檔案中以 inline function 實現temlate function。2,下面typename ...

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

1,很多編譯器都要求模板的定義和實現都在標頭檔案中,這是因為必須先為他提供某個實現品,然後才能呼叫,也只有如此才能通過編譯。目前唯一能讓 template的運用 具有可移植性的方式,就是在標頭檔案中以inline function實現temlate function。2,下面typename指出su...