在c++程式設計思想的第二卷中介紹了很多更深入的c++特性,這是現代c++程式設計的精髓
模板
1.一般類的宣告和定義都在h和cpp兩種檔案中,主要是怕連線時的多重定義,但是對於模板可以放心的將他們都放在h檔案中,因為template後面的東西編譯器不會為其分配空間,知道有乙個模板例項告知。如果不適用內斂的方式,在每次定義模板的函式前都要宣告template,而且宣告中的類名後面要加《引數》
2.可以這樣定義模板類
template
template
template//乙個預設值
定義函式模板
templatevoid f();
templatevoid f();
在使用函式模板時通產個可以省略模板引數(在可以推斷出來的時候)
可以這樣定義成員函式模板:在類的內部,定義乙個函式templatevoid f();這個甚至可以是建構函式。
3關鍵字typename:表示他限定的那個詞是乙個型別(類內的)而不是乙個成員:typename seq::iterator it;如果不加這個關鍵字,那麼編譯器會認為iterator是成員,有語法錯誤,加上後表示這是乙個型別,而it是乙個變數。同樣template關鍵字也只能用在模板類中,這個關鍵字表示他後面出現的那個《為模板引數列表符而不是小於號。
4.模板的特化
全特化:
template
class widget
;template <>
class widget
; 其中 modaldialog 和 mycontroller 時定義好的classes,在這裡當你構建widget例項時,將用下面的建構函式,而其他的用上面的,上面的稱泛化,下面的叫特化
偏特化:就是部分引數特化,部分泛化
template // window
class widget// mycontroller
;這裡window是範化的,mycontroller是特化的,也就是構造乙個任意類和mycontroller的例項時呼叫這個建構函式
這個構造可以很複雜,泛化的類可以也是乙個模板類
template
class widget, mycontroller>
;5.區域性類:
也就是定義在函式中的類,這個類不能定義static成員變數,也不能訪問non-static的區域性變數
void fun()
; ... code using local ...
}函式不能偏特化
異常處理
1.捕獲所有異常使用catch(...)
2重新像更高一級跑出異常要在catch子句中寫乙個throw
3、不捕獲異常,如果異常沒有被任意乙個層次捕捉到,那麼就睡直接呼叫程式中的terminate函式,它的預設實現是abort(),這不是乙個正常終止程式的方式,全域性變數不被析構
可以使用set_terminate來設定自己的terminate函式。
4、標準異常類:exception,他有很多派生類提供各種異常,可以查閱
5異常規格說明:void f();可能跑出各種異常void f() throw(a,b..);理論上只丟擲這些異常;void f()throw();理論上不丟擲任何異常;
如果程式丟擲了不在描述中的異常,那麼會呼叫unexpected()函式,預設下這個函式執行terminate函式,可以使用set_unexpected()來重新設定這個函式。
函式物件:
他是實現了過載()的類的乙個例項。
在stl的演算法中,這個類的例項通常被用來作為判定函式,它並不是函式,但是因為他過載了(),可以呼叫a(),類似於乙個函式,所以叫做函式物件,它比簡單的判定函式的好處在於它是乙個類的物件,它裡面可以儲存更多的資訊
在通用演算法中,演算法有幾元,它的判定函式就必須使用幾元,演算法的元是指它傳遞到判定函式中的引數的個數。
stl演算法:
1、填充和生成:fill() fill_n() generate()
2、計數:count() count_if()
next/preve_permutation()[數學上的排列組合] rondom_shuffle()【隨機重排】 partition()[劃分,將滿足某個條件的元素移到開頭]
4、查詢和替換: find/findif()[線性查詢] adjacent_find()[查詢兩個臨近的相等元素] find_first_of()[在第二個序列上查詢與第乙個序列上某個元素相等的元素]
search()[查詢第二個序列是否出現在第乙個序列中(次序也一致)] find_end()[同serch,但是返回最後出現的那一段位置]
search_n()[查詢一組相鄰的同樣的值] min/max_element()[找到最小/大的那個值首次出現的位置] replace()replace_if()replace_copy_if()[找到後替換]
5、比較範圍:equal()【兩個範圍是否元素相同順序相同】lexicographical_compare()[比較兩個範圍的字典編纂順序]
6、刪除元素:remove() remove_if() remove_copy_if()
unique()[刪除相鄰的同樣的元素(相鄰的值留下乙個),通常之前先用sort(),這樣可以每個元素都只有乙個]
7、排序合併:sort()[按公升序排序] stable_sort()[按公升序排序並保持相等元素的順序] partitial_sort()【部分排序】nth_element()[保證其中乙個元素作為劃分點,左側小於它,右側大於他,用
於算中值和百分點] binary_serach()[在已排序的範圍內尋找] upper_bound()[在乙個範圍內找出大於乙個值的元素最後出現的那個位置]
equal_range()【找到在乙個範圍內某只出現的範圍】merge() inplace_merge()[合併]
在已拍好序的集合上的集合運算
include()【是否包含】set_union/differrence/intersection/symmetric_difference()
8、堆運算:通常可以將乙個序列轉化成一種類似於對的結構,在這裡面便於一次找出優先權最高的元素
make_heap()[將序列轉化成堆]push_heap() pop_heap()[將堆頂的元素一道序列的最尾斷,不是移除]sort_heap()【將乙個堆序的序列重新變成乙個按順序排列的序列】
9、對乙個範圍的成員全部應用某種運算;foreach()【對每個成員使用某個函式】transforma()【對每個成員使用某個函式並把結果寫入乙個序列】
10、數值演算法:accumulate()【對所有元素迴圈的呼叫乙個函式得到乙個累計的值】inner_product()【內積】partitial_sum()adjacent_diffrence()[得到原數列相鄰元素的差]
11、其他:pair():乙個封裝兩個物件的類,通過make_pair()構造
distance():返回兩個迭代器之間的距離,增加次數
back_inserter/inserter/front_inseeter():為乙個容器構建乙個迭代器,這個迭代器只用於在某個位置進行插入
min() max() [比較] swap()[值交換]
容器:
容期間可以通過assign進行互相的轉換
vector:它可以快速的訪問,但支不持在中間插入,它溢位時的代價很高,因為先要分配更大的儲存空間,然後把原先的內容拷貝過來。可以使用reserved告知預先要多大的空間,而使乙個整數作為它的建構函式的第乙個引數的做法則是把所有的成員預設初始化。
使用vector的最有效的方法是,在開始使用reserved告訴預先需要的空間大小,然後只在序列後端插入或刪除元素
deque:在不確定物件數量時盡量用它而不用vector,因為它在兩端插入或刪除的效率更高。但是隨機訪問不如vector。它不支援中間插入。
list:在任意地方插入刪除,但是不支援隨機訪問,只能遍歷,遍歷效率也較慢。如果是較大較多的物件,尤其是構造很麻煩的物件,盡量使用它,如果要進行排序等更是的,因為在list中這通常只需要改變指標的指向而已。
介面卡:stack、queue、prioruty_queue為介面卡,他們是用vector、list和dequeue來實現的,每乙個介面卡都可以用它們分別實現。它們的預設方式通常被認為是最好的。
prioruty_queue:出於安全,它沒有設計迭代器,但是可以使用mack_heap等操作講vector模擬成優先佇列。
關聯式容器:set/multyset/map/multymap都是,它們的特點是將乙個值關聯乙個關鍵字,set可看成只有關鍵字。
set:存放唯一的且排過序的成員。
表示二進位制位:
c中沒有表示二進位制數值的方法,只有十進位制和十六進製制,有兩個方法可以代替。
bitset類:它表示有固定位數的二進位制串。
vector容器
valarray容器,他可以操縱一組陣列,然後進行各種數值運算,可以對其中的一部分切片出來分析。
論程式設計技術和程式設計思想
之前一直在糾結乙個問題,就是自己選擇的程式語言能不能應對快速變化的時代發展以及就業的需要,哪一種語言更好?學習多深可以滿足需求?等等的問題 後來糾結的久了也就無所謂了,解決問題的思路對了,解決問題的方法有很多的時候你會在乎用哪個方法解決嗎?肯定是哪個順手就用哪個了,前提是有所涉獵。也就是說,不要求每...
程式設計思想第二版第二卷筆記3 輸入輸出流
輸入輸出流的靈活 安全 易用是使它替代c 風格的輸入輸出函式的主要原因。上圖是輸出輸出流的簡化類圖,可以看到,各種各樣的輸入輸出類都派生自同乙個類。輸入輸出流最基本的兩個運算子就是插入號 inserter 和提取號 extractor 基本用法 cout 目標 輸出目標,即將資訊插入目標 cin 目...
同步鎖 摘自《unix網路程式設計》第二卷
書中還提到 即使乙個程序終止時系統自動釋放某個鎖,那也可能解決不了問題。該鎖保護某個臨界區很可能是為了在執行該臨界區 期間更新某個資料。如果該程序在執行該臨界區的中途終止,該資料處於什麼狀態呢?該資料處於不一致狀態的可能性很大。如果核心僅僅在程序終止時自動解鎖的話,通常於事無補。需要小心使用。關於p...