1. 程式人生 > >『C++ Primer學習筆記』Chapter 3 string物件、vector物件以及陣列的配套型別,C風格字串問題和處理區別

『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為字元陣列,a3C風格字串。
string物件:即使初始化方法不同,都不包括空字元。

string s1("C++"); //直接初始化,不包括空字元
string s2 = "C++"; //拷貝初始化,除去最後的空字元其餘的拷貝到s2中,因此也不包括空字元

C風格字串、陣列、string物件以及vector物件的處理方法區別

C風格字串:C風格字串只能使用定義在標頭檔案cstring中的函式進行操作:長度、比較、連線和拷貝;

陣列:只能使用下標法、標準庫函式以及指標進行比較、連線等;不能將陣列的內容拷貝給其他陣列作為其初始值,也不能用陣列為其他陣列賦值。

string物件:可以直接進行比較和連線等操作;同時允許使用string物件初始化另外一個string物件,也可以相互賦值;

vector物件:可以直接進行比較操作;同時允許使用vector物件初始化另外一個vector物件,也可以相互賦值;