《C 標準程式庫》 第4章 通用工具

2021-09-06 09:31:23 字數 2903 閱讀 1747

第1~3章 略

std::pair 是乙個 struct ,定義於 bits/stl_pair.h 檔案中,被包含進 標頭檔案中。

std::make_pair(42,'

@') //

相當於 std::pair(42,'@')

std::pair p = std::make_pair(42,3.3);   //

42,3

任何函式需要返回兩個值,必須使用 pair; 標準程式庫中 map 和 multimap 容器的元素型別也是 pair。

std::auto_ptrp(new int(3));  定義於 backward/auto_ptr.h 檔案中,被包含進 標頭檔案中。

auto_ptr 要求乙個物件只有乙個擁有者,絕對不應該出現多個 auto_ptr 擁有乙個物件的情況。如:

std::auto_ptrp1(p);  

std::cout

<<*p1okstd::cout<<*p段錯誤

auto_ptr 的 copy 建構函式 和 assignment 操作符會將物件擁有權交出去。

程式設計師需要自己來保證那個」失去了所有權、只剩下乙個 null 指標「的原 auto_ptr 不會再次被進行提領動作。

將 auto_ptr 作為函式引數或函式返回值,一定要特別注意所有權問題。比如:

std::auto_ptr p(new

int(42

));fun(p);    

//p的所有權已經轉交出去

*p = 18;  //

error

不要試圖使用 pass by reference 方式來傳遞 auto_ptr ,因為你根本無法預知擁有權是否被轉交。

如果用 const 來修飾乙個 auto_ptr ,並非意味著不能更改它擁有的物件,而是意味著你不能更改 auto_ptr 的所有權。

auto_ptr 的注意點:

1、auto_ptr 之間不能共享擁有權,乙個 auto_ptr 不能指向另乙個 auto_ptr 所擁有的物件。

2、並不存在針對 array 而設計的 auto_ptr,因為 auto_ptr 是通過 delete 而不是 delete 來釋放物件的。

3、它的通用性不強,它不是引用計數型指標。

4、auto_ptr 不滿足 stl 容器對元素的要求,比如拷貝和賦值動作。

c++11標準已經廢棄了 auto_ptr ,取而代之的是  unique_ptr。

數值極限(numeric limits)是與平台有關的,c++標準庫通過 template numeric_limits 提供這些極值,取代傳統c語言所採用的預處理器常數。前者定義於標頭檔案 中,後者整數常數定義於 和 ,浮點常數定義於 和 中,推薦使用前者,有更好的型別安全性。

numeric_limits 中提供了通用性的 template 和特化版本,如:

template  class

numeric_limits ;

template

<> class numeric_limits ;

使用示例如下:

#include #include 

#include

intmain()

在兩個值之間挑選較大值和較小值的輔助函式,定義於 ,被包含進 標頭檔案。原始碼如下:

templateinline 

const _tp&max(

const _tp& __a, const _tp&__b)

template

inline

const _tp&max(

const _tp& __a, const _tp&__b, _compare __comp)

min 函式實現類似,略。使用示例如下:

#include #include 

struct

user

bool

operator

<(const user& user2) const

//這裡只需要實現 operator< 即可

intid;

};bool

compareuser(user user1,user user2)

intmain()

有四個比較操作符的 template functions ,分別定義了 !=, >, <=, >= ,它們都是利用操作符 == 和 < 完成的,定義於標頭檔案 ,位於命名空間 std::rel_ops;

namespace

std template

inline

bool

operator>(const t& x, const t&y)

template

inline

bool

operator

<=(const t& x, const t&y)

template

inline

bool

operator>=(const t& x, const t&y)

}}

只需要定義 < 和 == 操作符,然後 using namespace std::rel_ops; 上述四個操作符就自動獲得了定義。

#include #include 

struct

user

bool

operator==(const user& user) const

bool

operator

<(const user& user) const

intid;

};int

main()

C 標準程式庫 筆記 第2章,第3章

2.2.1 typename的作用 t subtype 表示型別t中的乙個靜態變數 typename t subtype 表示t中的乙個子型別 成員函式模板可以放寬引數的檢查範圍 建構函式模板可以在複製物件時實現隱式型別轉換。2.2.2 int i int 2.2.4 koenig lookup規則...

C 標準程式庫

1.如果要把乙個template中的某個識別符號號指定為一種型別,就算意圖顯而易見,關鍵字typename也不可或缺,因此一般的規則是,除了以typename修飾之外,template內的任何識別符號號都被視為乙個值而非乙個型別.2.類的成員函式可以是個template,但這樣的成員函式既不能是vi...

c 標準庫實戰之通用工具Pair

pair與tuple都是標準庫提供的通用工具,主要用來組合兩個或者多個值。pair可以由引入,定義在bits stl pair.h中 brief struct holding two objects of arbitrary type.tparam t1 type of first object.t...