string是C++標准庫最重要的類型之一,string支持長度可變的字符串,其包含在string頭文件中。本文摘自《C++PRIMER 第四版·特別版》和個人的一些總結。
一.聲明和初始化
聲明前必須在頭文件中包含<string>標准庫,聲明如下:
string s1; //聲明一個string對象 string s2[10]; //聲明一個string對象的數組
string類型有幾種構造函數,所以其初始化方式也有以下幾種:
string s1; 默認構造函數,s1為空串 string s2(s1); 將s2初始化為s1的一個副本 string s3("value"); 將s3初始化為一個字符串字面值副本 string s4(n,'c'); 將s4初始化為字符'c'的n個副本 string s5(s4.begin(),s4.begin()+s4.size()); 將s5初始化為迭代器指向的s4的范圍的內容 string s6(cp,n); 將s6初始為cp指向的數組的前n個元素的副本 string s7(s6,pos); 將s7初始化為一個已存在的string對象s6從下標pos開始的字符的副本 string s8(s7,pos,len); 將s8初始化為s7從下標pos開始的len個字符的副本,如果pos>s7.size()則操作未定義,無論len為多大,最多只能復制s7.size()-pos個字符
二.讀寫操作
讀寫操作可用標准庫的cin和cout,值得注意到是讀入操作,從標准輸入讀取入string對象時:(1)讀取並忽略開頭的所有空白字符(如空格、換行符、字表符);(2)讀取字符直到再次遇到空白字符,讀取終止。如果輸入" Hello World"則屏幕上講輸出"Hello",前后的空白被忽略。
三.常用操作
下面列出了string對象的常用操作。
s.empty(); 如果s為空串,則返回true,否則返回false s.size(); 返回s中字符的個數 s[n]; 返回s中位置為n的字符,從0開始計數 s1+s2; 把s1和s2拼接成一個新的字符串,返回新生成的字符串 s1=s2; 把s1的內容替換為s2的一個副本 s1==s2; 比較s1和s2的內容,相等則返回true,否則返回false
!=,<,<=,>和>= 保持這些操作符慣有的含義
下面說明上面提到的操作值得注意的地方:
(1)任何存儲string的size操作結果的變量必須為string::size_type類型。特別說明,不要把size的返回值賦值給一個int類型,因為有時int類型的大小不足以裝下size返回的值。
(2)關系操作符!=,<,<=,>,>=比較兩個對象時采用了和字典排序相同的策略:如果兩個string對象長度不同,且短的對象和長的對象的前面部分相匹配,則短的對象小於長的對象;如果兩個string對象的字符不同,則比較第一個不匹配的字符。如:
/*對於下述代碼有:s1<s2,s2<s3*/ string s1="Hello"; string s2="Hello World"; string s3="Hiya";
(3)string對象的加法被定義為拼接,如把s2追加到s1的末尾可直接用s1+=s2表達式即可。當需要string對象和字符串混合拼接時,+操作符的左右操作數中必須有一個是string對象。如
string s1="hello"; string s2="world"; string s3=s1+","; //合法 string s4="hello"+","; //非法,+號兩邊都沒有string對象 string s5=s1+","+"hello"; //合法,s1先和","拼接返回一個string對象,再和"hello"拼接 string s6="hello"+","+s2; //非法,"hello"先和","進行+操作,兩個都不是string對象
(4)由(1)可知,對於string對象的下標操作符的索引(或叫下標)應使用size_type類型,以便於能遍歷整個string對象。如下遍歷取出string對象的所有字符:
for(string::size_type ix=0;ix != s.size();ix++) cout<<s[ix]<<endl;
四.字符處理
我們經常要對string對象的單個字符進行處理,在cctype頭文件中包含了各種字符操作函數。下面列出了這些函數:
isalnum(c); 如果c是數字或字母,則為true isalpha(c); 如果c是字母,則為true iscntrl(c); 如果c是控制字符,則為true isdigit(c); 如果c是數字,則為true isgraph(c); 如果c不是空格,但可打印,則為true islower(c); 如果c是小寫字母,則為true isprint(c); 如果c是可打印的字符,則為true ispunct(c); 如果c是標點符號,則為true isspace(c); 如果c是空白字符,則為true isupper(c); 如果c是大寫字母,則為true isxdigi(c); 如果c是十六進制,則為true tolower(c); 返回其小寫字母形式 toupper(c); 返回其大寫字母形式
五.其他操作
1.insert、assign和erase函數
string類型支持許多容器在操作時都以迭代器為基礎,很多操作函數不同容器都能使用,但是不同的容器也會根據需要對函數進行必要的添加或減少。如string和vector中很多操作都是類似的,很多函數也是相同的。如下面列出了string類型和容器類型共有的操作:
s.insert(p,t); 在迭代器p所指向的元素之前插入一個值為t的元素。返回指向新插入元素的迭代器 s.insert(p,n,t); 在迭代器p指向的元素之前插入n個值為t的元素。返回void s.insert(p,b,e); 在迭代器p所指向的元素之前插入迭代器b和e標記范圍內的所有元素。返回void s.assign(b,e); 用迭代器b和e標記范圍內的元素替換s。對於string類型,返回s;對於容器類型,返回void s.assign(n,t); 用n個t替換s。對於string類型,返回s。對於容器類型返回void s.erase(p); 刪除迭代器p指向的元素。返回一個迭代器,指向被刪除元素后面的元素 s.erase(b,e); 刪除迭代器b和e標記范圍內的元素,返回一個迭代器,指向被刪除元素后面的第一個元素
下面為string類型特有的操作版本:
s.insert(pos,n,c); 在下標為pos的元素之前插入n個字符c s.insert(pos,s2); 在下標為pos的元素之前插入string對象s2的副本 s.insert(pos,s2,pos2,len); 在下標為pos的元素之前插入s2從下標pos2開始的len個字符 s.insert(pos,cp,len); 在下標為pos的元素之前插入cp所指向數組的前len個字符 s.insert(pos,cp); 在下標為pos的元素之前插入cp所指向的以空字符結束的字符串副本 s.assign(s2); 用s2的副本替換s s.assign(s2,pos2,len); 用s2從下標pos開始的len個字符替換s s.assign(cp,len); 用cp所指向數組的前len個字符替換s s.assign(cp); 用cp所指向的以空字符結束的字符串副本替換s s.erase(pos,len); 刪除從下標pos開始的len個字符 /*除非特殊說明,上述所有操作都返回s的引用*/
2.append和replace函數
string類型提供了容器類型不支持的幾種操作:append、replace、substr和一系列find函數。其中append和replace函數用於修改string對象。append操作提供了在字符串尾部插入的捷徑。replace操作用於刪除指定一段范圍內的字符,然后在刪除位置插入一組新字符,等效於調用insert和erase函數。
/*修改string對象的操作,arg在下表*/ s.append(args); 將args串接在s后面。返回s的引用 s.replace(pos,len,args); 刪除s中從下標pos開始的len個字符,用args指定的字符替換之,返回s的引用 s.replace(b,e,args); 刪除迭代器b和e標記的范圍內所有的字符,用args替換它。返回s的引用
/*append和replace操作的參數:args*/ s2 string類型的字符串 s2,pos,lens 字符串s2從下標pos開始的lens個字符 cp 指針cp指向的以空字符結束的數組 cp,len2 cp指向的以空字符結束的數組的前len2個字符 n,c 字符c的n個副本 b2,e2 迭代器b2和e2標記范圍內的所有字符
3.子串操作substr函數
使用substr操作可以在指定的string對象中檢索需要的子串。
s.substr(pos,n); 返回一個string類型的字符串,它包含從s從下標pos開始的n個字符 s.substr(pos); 返回一個string類型的字符串,它包含從下標pos開始到s的末尾的所有字符 s.substr(); 返回s的副本
4.查找操作find函數
string類提供了6種查找函數,每種函數以不同形式的find命名。這些操作全都返回string::size_type類型的值,以下標的形式返回匹配的位置。當沒有匹配到時返回一個string::npos的特殊值。npos定義為保證大於任何有效的下標值。
/*string類型的查找操作,其參數args在下表*/ s.find(args); 在s中查找args的第一次出現 s.rfind(args); 在s中查找args的最后一次出現 s.find_first_of(args); 在s中查找args的任意字符的第一次出現 s.find_last_of(args); 在s中查找args的任意字符的最后一次出現 s.find_first_not_of(args); 在s中查第一個不屬於args的字符 s.find_last_not_of(args); 在s中查找最后一一個不屬於args的字符
每個查找都有四個重載版本,如下表:
c,pos 在s中,從下標pos標記的位置開始,查找字符c。pos的默認值為0 s2,pos 在s中,從下標pos標記的位置開始,查找string對象s2。pos的默認值為0. cp,pos 在s中,從下標pos標記的位置開始,查找指針cp指向的一空字符結束的字符串。pos的默認值為0. cp,pos,n 在s中,從下標pos標記的位置開始,查找指針cp所指向的數組的前n個字符。pos的默認值為0.
5.比較操作compare函數
compare函數用於實現string類型的字典順序的比價。compare返回下面是三種可能之一:
(1)正數,此時s1大於args所代表的string對象。
(2)負數,此時s1小於args所代表的string對象。
(3)0,相等。
s.compare(s2); 比較s和s2 s.compare(pos1,n1,s2); 讓s中從pos1下標位置開始的n1個字符與s2做比較 s.compare(pos1,n1,s2,pos2,n2); 讓s中從pos1下標位置開始的n1個字符與s2中從pos2開始的n2個字符相比較 s.compare(cp); 比較s和cp所指向的以空字符結束的字符串 s.compare(pos1,n1,cp); 讓s中從pos1下標位置開始的n1個字符與cp所指向的以空字符結束的字符串比較 s.compare(pos1,n1,cp,n2); 讓s中從pos1下標位置開始的n1個字符與cp所指向的字符串的前n2個字符串比較
參考文獻
《C++ PRIMER》 中文版
