摘要
C++ 離散知識點
- 在不同源文件可define同一個宏(宏作用域爲從#define開始到當前源文件結束)
- 防止頭文件重複包含指的是:防止某個源文件重複包含同一個頭文件兩次,但是同一個頭文件可以同時被不同源文件各包含一次。
- 類一般在頭文件中定義,在類內定義的函數默認是
內聯(inline)
的,而在類內聲明,在類外定義的函數則不默認爲內聯(inline)
。 - 頭文件內定義的變量會自動被加上
extern
。 - 在頭文件裏定義函數的幾種方法:
- 聲明類,在類中定義靜態成員函數,並在頭文件中實現函數。
- 使用模板函數(其要求聲明和定義都在頭文件中)
(沒有試過)
。 - 定義爲內聯函數
inline
。
C++ 語法
- 負數求餘和商都是負數。例如
-123 / 10 = -12
,-123 % 10 = -3
。 string
類型前要加std::
- 定義
std::string a="123456"
, 那麼a[a.length() - 1] == '6'
而不是'\0'
。 char a = ''
會報錯,因爲不能初始化爲空字符。至少也要是char a = '\0'
- 注意:棧
stack
沒有reserve
方法。(TODO:C++ prime還是算法設計與分析中似乎有總結哪些結構含有reserve,看一下) - 注意vector的size是無符號的。例如
vector<int> aa;
,當aa.size()
爲0時,aa.size()-1
不是-1而是一個無符號數的最大值。在所以建議以後i<aa.size()-1寫爲i+1<aa.size() - C++中,有符號類型數向右位移有點特殊,向右位移時,最左邊補0還是補1好像得看機器具體實現。若總是補0則稱爲
logical shift
,若補符號位
則稱爲arithmetic shift
,目前C++的編譯器似乎都是補符號位(即arithmetic shift
),例如10000000 >> 1
結果爲11000000
。除了這種特殊情況,其他時候位移空缺的位都補0。(leetcode的C++編譯器不能對負數右移,不知道爲啥,如-1>>1在運行時會報錯,參考這裏也報錯,要把這個弄清楚,否則後序在線筆試時提交代碼可能會出錯) - C++中,有符號數和無符號數在一起進行運算時,首先會將有符號數按照其補碼轉換爲無符號數,再進行運算。(其實可以這麼看,機器不認有無符號,全都按照補碼來進行計算,最後的結果是補碼,按照無符號數的方式解讀。)例:
結果是"a>b",因爲a的補碼是全1,被當成無符號數後爲65535,那自然大於b。short a = -1; unsigned b = 1; if(a < b) printf("a<b"); else printf("a>b");
- C++變量未初始化的後果。未初始化的全局變量會自動初始化爲0,未初始化的局部變量一般爲亂碼。參考這裏。當然我覺得具體情況還得看編譯器吧。
C++ 庫函數
int isalnum ( int c )
:頭文件\<ctype\>
,檢查一個字符是不是字母或數字(alphanumeric)。int tolower(int c);
:頭文件\<ctype\>
,將一個字符轉換爲小寫字符。