第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(newint(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 classnumeric_limits ;
template
<> class numeric_limits ;
使用示例如下:
#include #include#include
intmain()
在兩個值之間挑選較大值和較小值的輔助函式,定義於 ,被包含進 標頭檔案。原始碼如下:
templateinlineconst _tp&max(
const _tp& __a, const _tp&__b)
template
inline
const _tp&max(
const _tp& __a, const _tp&__b, _compare __comp)
min 函式實現類似,略。使用示例如下:
#include #includestruct
user
bool
operator
<(const user& user2) const
//這裡只需要實現 operator< 即可
intid;
};bool
compareuser(user user1,user user2)
intmain()
有四個比較操作符的 template functions ,分別定義了 !=, >, <=, >= ,它們都是利用操作符 == 和 < 完成的,定義於標頭檔案 ,位於命名空間 std::rel_ops;
namespacestd 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 #includestruct
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...