標籤:style blog ar color 使用 sp div log bs
在某種程度上,可以將string類型視為字元容器,支援很多容器操作。與vector相似,string的字元也是連續儲存的,因此也有capacity和reserve操作。另外,也可用迭代器輸出字串,如下例:
string s("Hello world!");string :: iterator iter = s.begin();while(iter!=s.end()){ cout << *iter;}
在建立一個string對象並初始化時,有以下幾種方法(ch1、ch2、ch3為定義的字元數組):
char *ch1 = "hello world!";char ch2[] = "goodbye";char ch3[] = {‘a‘,‘b‘,‘c‘};string s1; string s2(2,‘a‘);string s3(s2);string s4(s3.begin(),s3.end());string s5(ch1);string s6(ch2,7);string s7(ch2+4,2);string s8(ch3);string s9(ch3,2);string s10(s6,2);string s11(s6,0,4);string s12(s6,0,10);
上述代碼中s1-s9的建立中,s8的建立string對象是錯誤的!!!!下面分析每個對象:
- s1:沒有採用其它對象進行初始化,而是調用了預設建構函式,因此,s1為空白字元對象,即s1="";
- s2:採用2個字元a初始化s2,因此s2="aa";
- s3:s3是s2的一個副本,因此s3="aa";
- s4:採用兩個迭代器之間的元素進行初始化s4,s3.begin()存放s3的第一個元素,s3.end()指向s3最後一個元素的下一個,但初始化為左閉合,因此不包括s3.end(),因此。s4="aa";
- s5:使用只有一個指標參數的建構函式定義s5,該指標指向以Null 字元結束的數組ch1的第一個自讀,這個數組的所有字元,但不包括null(C風格字串是以null結尾的),都被複製到新建立的s5中,s5="hello world!";
- s6:s6的初始化是通過一個指標和一個計數器來實現的,從這個指標指向的字元開始,複製該指標後面連續計數器個數的字元到新建立的string對象中,s6="goo";
- s7:s7的初始化與s6類似,但傳進的指標是ch2數組中指向b的指標,s7="by";
- s8:s8並不是採用C風格字串,調用這種形式的初始化式,必須是以Null 字元結束的數組。將不包含null的數組傳遞給此建構函式,將導致編譯器無法檢測的嚴重錯誤,只有當遇到null時,s8的初始化才會停止;
- s9:然而,s9的初始化是正確的,初始化包含了一個計數器,指明了需要複製的元素的個數,該元素個數必須小於數組長度,無論數組是否以null結尾都沒有什麼關係。s9="ab";
- s10:將s10初始化為s6的一個子串,第二個參數指定了開始複製的位置,從制定位置複製到最後,因此s10="odbye";
- s11:s11與s10是同種初始化方式,其中,第二個參數制定了開始複製字元的位置,第三個參數制定了複製的長度,因此s11="good";
- s12:當複製的長度超過字串的結尾時,標準庫規定只能複製到與被複製string對象結尾處,s12="goodbye"。
string對象的幾種構造方法