『C++ Primer學習筆記』Chapter 3 string物件、vector物件以及陣列的配套型別,C風格字串問題和處理區別
string物件、vector物件以及陣列(指標)配套的型別
無論是string
物件還是vector
物件,它們都有一個size()
的成員函式,因此就可能會有這樣的一個疑問:成員函式size()
返回的到底是什麼型別?之所以可能會有而不是一定會有是因為,當我們使用不同的方法處理這些物件時,我們可以使用(在range for或迭代器中)型別說明符auto
或者(在下標法)型別指示符decltype
來避免這個問題。
同樣地,對於陣列,我們也會有這樣的一個疑問:使用不同方法處理時又各對應的是什麼型別?因為一些方法(range for和標準庫函式)可以使用型別說明符auto
來避免,但是一些方法(下標法和指標)卻又很有必要了解。
更進一步的,由於迭代器和指標可以進行算術運算,它們的差值返回的又是什麼型別?
string物件
string
物件(的成員函式size()
)配套的型別為:
string::size_type
很顯然,它是一個無符號型別的值。
vector物件
vector
物件(的成員函式size()
)配套的型別為:
vector<int>::size_type
vector<string>::size_type
很顯然,它也是一個無符號型別的值。
迭代器
迭代器的型別為:
string::iterator
vector<int> ::iterator
vector<string>::iterator
該型別可讀元素亦可寫元素。
string::const_iterator
vector<int>::const_iterator
vector<string>::const_iterator
該型別只能讀元素不能寫元素。
由於迭代器可以進行算術運算,因此它的差值的型別為:
difference_type
很顯然,該型別的值可正可負。
陣列的下標
陣列下標的型別為:
size_t
很顯然,該型別的值不可為負。該型別變數常被初始化為常量表達式。
指標
由於指標可以進行算術運算,因此它的差值的型別為:
ptrdiff_t
知道以上不同物件的配套型別,我們就可以在知道其確切型別的情況下,靈活使用型別說明符auto
或者型別指示符decltype
。
C風格字串、字元陣列以及string物件的區別和聯絡
C風格字串:將字串存放在字元陣列中並以空字元('\0'
)結束。
字元陣列:根據字元陣列初始化方法的不同,將會產生不同的結果。
char a1[] = {'C','+','+'}; //列表初始化,沒有空字元
char a2[] = {'C','+','+','\0'}; //列表初始化,含有顯式的空字元
char a3[] = "C++"; //自動新增表示空字元結束的空字元
const char a4[6] = "Daniel"; //錯誤:沒有空間存放空字元!
其中a1,a2
為字元陣列,a3
為C風格字串。
string
物件:即使初始化方法不同,都不包括空字元。
string s1("C++"); //直接初始化,不包括空字元
string s2 = "C++"; //拷貝初始化,除去最後的空字元其餘的拷貝到s2中,因此也不包括空字元
C風格字串、陣列、string物件以及vector物件的處理方法區別
C風格字串:C風格字串只能使用定義在標頭檔案cstring
中的函式進行操作:長度、比較、連線和拷貝;
陣列:只能使用下標法、標準庫函式以及指標進行比較、連線等;不能將陣列的內容拷貝給其他陣列作為其初始值,也不能用陣列為其他陣列賦值。
string
物件:可以直接進行比較和連線等操作;同時允許使用string
物件初始化另外一個string
物件,也可以相互賦值;
vector
物件:可以直接進行比較操作;同時允許使用vector
物件初始化另外一個vector
物件,也可以相互賦值;