1.當我們在代碼中想要終止運行的話,我們可以采用Ctrl + C或Ctrl + Z,其中^C代表殺進程,^Z設置結束
2.編碼表:我們目前比較熟悉的是ASCII碼編碼方式,但是我們發現平時使用的漢字無法通過ASCII編碼,除此之外,世界上各個國家的文字都需要編碼,因此Unicode統一碼(萬國碼)被研發出來了,它針對世界上各個國家的語言采用不同的編碼方式,其中最常見的就是UTF-8,它針對不同的語言符號有不同長度的編碼,從1個字節到4個字節不等。UTF-16編碼長度固定為2個字節或4個字節,而UTF-32是以固定長度4個字節的編碼來表示語言符號的,它們在存儲上要消耗更大的空間,同時也能表示出更多符號,但UTF-8基本上能表示常見的字符了,因此一般使用UTF-8。
在string頭文件里我們也可以看到專門針對不同存儲方式的string,但是平時幾乎不使用,了解即可。
在我們國家,為了進一步表示一些字體,我們自己研發了GBK編碼方式,它在某種程度上比UTF-8表示中文更豐富。目前在Windows下大多采用的就是GBK編碼。
3.整型家族在static修飾的下可在聲明處定義
但注意僅限于整型家族,如flaot、double等都不支持這種寫法,都只能聲明和定義分離
4.初始化注意事項
由于new初始化方式比較易混,這里總結了一些常見的易混點,正常情況下別亂用
多參數易混點:
單參數易混點:
這里注意,只要開辟空間的形式是數組,那么不管開幾個空間,都會遵循數組的初始化規則
在其余初始化場景,也遵循上面的初始化規則
其中有幾種寫法很易混,最好不要這樣去寫
可以看到b和d的初始化內部被識別為initializer list,而a和c這樣的單參數卻不會被識別,要多加注意。
同時注意逗號表達式的()可以嵌套,只要滿足上面的初始化規則,就可以這樣寫
5.vector基本理解
在接觸了string之后,我們對每個容器的框架都有了一個基本的認識,因此其余容器的學習就會輕松一些。?
(1)vector相當于我們之前接觸過的順序表,是對連續的數據進行存儲,這個數據可以是任意類型,但是不支持int、double等存到同一個vector里,因為vector的實現涉及模板template,需要顯式實例化,如果出現多種類型會發生推理沖突。空間配置器是vector模板聲明第二個參數,涉及內存池,有缺省值,我們不用太在意。
(2)string和vector<char>差距很大,string可以一次性加入一個串,而vector<char>只能單獨加字符,string不管怎么操作,數據最后一定有個\0,而vector尾插不會有這個功能,需要自己去處理\0的情況,很不方便。同時,vector<char>也缺少一些必要的接口,如c_str。
但vector和string很多接口相似,訪問都可以用下標+[],迭代器,范圍for(本質也是迭代器)
因此我們可知,string是專門針對字符數組的需求設計的,而vector是廣泛適應的,vector不能替代string,需要根據不同的場景有不同的選擇。
(3)初始化
(4)迭代器和string的沒有任何使用區別
(5)訪問和string的沒有任何使用區別
front和back的返回值和operator[]一樣,但注意back返回的不是最后一個元素的下一個位置,而是最后一個元素的位置,這里要和end迭代器做區分
(6)容量相關接口和string的沒有任何使用區別
唯一需要注意的是resize和reserve
resize不僅會擴容,還會填充開辟空間的值,注意缺省值
reserve只開辟空間(可能開辟的最終空間比n多),不做任何處理。
注意最好不要縮容,不同編譯器會有不同處理方式,比如msvc下,reserve很多情況下不會縮容,resize會縮容,但在g++下,都會縮容。
(7)在有的接口上,vector就和string有不同之處了,主要體現在參數的傳遞上
我們發現,vector下的接口要簡潔很多,多個數據的插入和刪除都是通過迭代器來控制的。
6.編譯器向上查找規則
當我們調用函數的時候,編譯器會從函數調用處向上查找該函數,如果沒有相關聲明或定義會報錯。那么下面這種情況是什么導致的呢?
很多人會認為是因為test.h中沒有展開std導致cout和endl不能使用,但是下面這種情況呢?
我們依然需要用向上查找來解釋。
.h文件在預處理階段就會展開,因此.h不存在編譯鏈接的情況,所以根據“.h中沒有展開std導致cout和endl不能使用”完全是錯誤的。在.h展開后,在調用test()時,需要向上查找cout,但是cout是在std命名空間里的,所以需要展開命名空間才能正常訪問。
圖1展開命名空間的語句在展開頭文件的下面,因此在向上查找的情況下,并不會讀取using namespace std,也就不會在std命名空間里找,所以找不到。
而圖2展開命名空間的語句在展開頭文件的上面,因此查找的時候會到std命名空間里找。