前言算法
《C++ Primer》第三版這本書仍是去年作Window Mobile 6開發時看完的,看完後作了一些筆記到本子後就沒管了。今天偶爾翻出來趕忙寫一篇文章備份一下,聽說每次重讀這本書都有新的收穫,正所謂溫故而知新,可見這本書之經典。
數組
1. 若是一個變量是在全局定義的,系統會保證給它提供初始化值0。若是變量是局部定義的,或是經過new表達式動態分配的,則系統不會向它提供初始值0
測試
2. 通常定義指針最好寫成:" string *p; " 而不是 " string* p; "
優化
3. 試圖將一個非const對象的指針指向一個常量對象的動做將引發編譯錯誤spa
4. 引用類型主要做用於函數的形式參數 P/89指針
5. 枚舉成員的值沒必要惟一對象
6. 一個數組不能被另一個數組初始化,也不能被賦值給另外一個數組。並且,C++不容許聲明一個引用數組(即由引用組成的數組) P/95
7. volatile修飾符的主要目的是提示編譯器,該對象的值可能在編譯器未檢測到的狀況下被改變,所以編譯器不能對引用這些對象的代碼做優化處理。
8. 逗號表達式的結果是最右邊表達式的值(從左向右) P/135
9. 關於位操做符的詳細介紹和使用方法參見P/136,講得很透徹
10. 容器
10.1 關聯容器
10.1.1 map P/247
"鍵/值"對:鍵用來索引map,而值用來存儲數據。
插入單個元素最好用insert(不使用下標方式) P/248 - P/249
10.1.2 set P/256
10.1.3 比較 P/247
若是隻想知道一個值是否存在時,用set最有用,但願存儲(也可能修改)一個相關的值時,map最有用
10.2 順序容器
10.2.1 list
非連續內存區域,容許雙向遍歷,插入、刪除效率高,對隨機訪問支持很差,須要遍歷,且每一個元素有兩個指針的額外空間開銷。
10.2.2 vector
表示一段連續的內存區域,每一個元素被順序存儲在這段內中。隨機訪問效率很高,可是插入、刪除效率低(除非是最後一個元素),右邊的元素都要從新拷貝一次。(deque也是一端連續內存,可是支持高效的在首部插入和刪除元素。它經過兩級數組結構來實現。)
vector自增加方式:分配兩倍於當前容器的存儲區,把當前的值拷貝到新分配的內存中,並釋放原來的內存。
10.2.3 list與vector比較 (vector仍是list? P/213)
11. 調用函數比直接計算條件操做符要慢得多——inline機制用來優化小的、只有幾行的、常常被調用的函數 P/303
12. 頭文件不該該含有非inline函數或對象的定義
13. 在函數中頻繁使用的自動變量可以使用register聲明爲寄存器自動對象。出如今循環語句中的數組索引和指針是寄存器對象的很好例子:
for( register int ix = 0; ix < sz; ++ix )
若是所選擇的變量被頻繁使用,則寄存器變量能夠提升函數的執行速度。
注意:關鍵字register對編譯器來講只是一個建議,有些編譯器可能忽略該建議,而是使用寄存器分配算法找出最合適的候選放到機器可用的寄存器中。 P/337
14. 若是操做數被設置爲0,則C++會保證delete表達式不會調用操做符delete(),沒有必要測試是否爲0。 P/340
if( pi != 0 ) //不必寫這行
delete pi;
15. delete pi 以後,pi成爲空懸指針,建議設置指針爲0 P/340
16. 自動指針auto_ptr 見P/341
17. C++支持從C語言繼承而來支持顯式初始化表的機制,相似於用在初始化數組:
Data local1 = { 0, 0 };
//至關於local1.ival = 0; local1.ptr = 0;
根據數據成員被聲明的順序,這些值按位置被解析。 P/566
18. explict關鍵字用於關閉編譯器隱式轉換
19. 每一個return語句之間,內聯析構函數都必須被展開(編譯時),因此建議函數內儘可能少return,可用其它變量代替的就代替。
20. int a = b + c ; //是對a的初始化
int a;
a = b + c ; //賦值操做,前面比後面高效
21. "::"、".*"、"."、"?:"四個操做符不能被重載
22. typeid用於獲取對象/變量的實際類型,用法:typeid(type).name()
23. 函數介紹
sizeof 做用是返回一個對象或類型名的字節長度。 P/132
isalpha 判斷是否是一個英文字母
#include <cstring>
int strlen( const char* ) //返回字符串的長度
int strcmp( const char*, const char* ) //比較兩個字符串是否相等
char* strcpy( char*, const char* ) //把第二個字符串拷貝到第一個字符串中
#include <assert.h>
assert 通用預處理宏(斷言 P/12)
#include <algorithm> //包括各類數據結構的元素檢索、替換、逆序等等通用的算法。sort/find/max
#include <iomanip>
setw() //功能與scanf相似,它讀入的字符數最多爲傳遞給它的參數減1 P/112