? ? ? ?string提供字符串的功能,使用時需要引入頭文件<string>,string和vector類似芋忿,vector是對數(shù)組的封裝呻疹,而string是對字符串的封裝击狮。從面向?qū)ο蠼嵌葋碇v,C風(fēng)格字符串是難以操控的栗精。所以STL里提供了面向?qū)ο蟮膕tring封裝闯参。
? ? ? ? string內(nèi)部仍然是維護一個char型數(shù)組,并且也是以0結(jié)尾的悲立。對外提供了字符串操作常用的函數(shù)鹿寨,如append、clear薪夕、at脚草、length等操作,并支持復(fù)制原献、賦值等操作馏慨,重載了必要的操作符,使用戶可以以一個對象的視角姑隅;來操作字符串写隶。下面列舉幾個string主要函數(shù):
append-----附加字符串;
clear-----清空讲仰;
capacity-----容量慕趴;
size-----實際長度;
length-----實際長度叮盘,等同于size函數(shù)秩贰;
at-----按索引訪問字符;
find-----查找一個字符或子串柔吼;
rfind-----從后往前查找一個字符或子串毒费;
find_first_of-----查找匹配若干字符串中的一個字符;
find_first_not_of-----查找不匹配若干字符串的一個字符愈魏;
find_last_of-----從后往前查找觅玻,匹配若干字符串中的一個字符想际;
find_last_not_of-----從后往前查找,不匹配若干字符中的一個字符溪厘;
substr-----取得一個子串胡本;
insert-----插入字符或子串;
replace-----替換字符或子串畸悬;
構(gòu)造string對象可以有以下幾種方式:
string str1("LiMing"); ? ? ? ? ?//以一個C風(fēng)格字符串構(gòu)造
string str2 = "WangHua"; ? ? ? ? ?//以一個C風(fēng)格字符串構(gòu)造
string str3 ("abcde",5); ? ? ? ? ?//參數(shù)1是C字符串侧甫,參數(shù)2是長度
string str4; ? ? ? ? //空字符串
string str5 = " "; ? ? ? ? ?//空字符串
注意:一定不要用NULL來初始化string蹋宦,否則會讓程序崩潰披粟。
1)append/clear
append用于在末尾附加若干字符或字符串,例如:
#include<stdio.h>
#include<string>
using namespace std;
int main()
{
string str;
str.apend("something else"); ? ? ?//附加一個字符串
str.apend("abcde",5); ? ? ? ? ?//附加一個字符串:賦值前5個字符
str.apend("abcde",1,3); ? ? ? ? //附加一個字符串冷冗,七點offset=1守屉,長度3,即復(fù)制bcd
str.apend(2,'h'); ? ? ? ? ?//附加兩個h字符
return 0;
}
? ? ? ? 和vector一樣當(dāng)附加字符是蒿辙,內(nèi)部緩沖區(qū)size = capacity時會自動擴充緩沖區(qū):先申請一塊更大的內(nèi)存拇泛,再把原有數(shù)據(jù)復(fù)制過去。
2)size/capacity/resize/clear/length
? ? ? ? string的內(nèi)部存儲原理和vector相同思灌。size用于得到已經(jīng)存儲的字符串長度俺叭,capacity表示剩余可用長度。length和size完全相同习瑰。
? ? ? ? resize用于顯式地設(shè)置string內(nèi)部緩沖區(qū)的容量capacity绪颖,clear用于清空緩存區(qū)內(nèi)的所有字符,如果希望避免append低效問題甜奄,可以事先申請一個大緩沖區(qū)。
3)at
? ? ? ? ?at用于按索引訪問字符窃款,at函數(shù)返回的是第一個reference课兄,因為可以用at修改字符串的內(nèi)容。例如:
? ? ? ? ?str.at(0) = 'K';
? ? ? ? ?char ch = str.at(0);
? ? ? ? ? string頁重載了操作符[],作用與at等同晨继,例如:str[0] = 'K';
4)字符串比較
? ? ? ? ? C風(fēng)格字符串使用strcmp函數(shù)進行大小比較烟阐,而string重載了所有關(guān)系操作符,所以用起來會直觀一些紊扬。
5)字符串查找
? ? ? ? ?C風(fēng)格字符串用strstr函數(shù)進行子串查找蜒茄,并不是太方便。string提供若干查找函數(shù)餐屎,方便里查找操作檀葛。
? ? ? ? find函數(shù)用于查找一個字符或子串,從左到右依次查找腹缩,知道第一次匹配時屿聋,返回匹配的位置空扎,如果沒有查找到任何匹配,則返回-1,润讥。這里說的位置或偏移转锈,是從0開始的,和數(shù)組下標(biāo)法相同楚殿。例如:
? ? ? ? string str = "LiMing is doing homework";
? ? ? ? 查找i的位置撮慨;
? ? ? ? ?int pos = str.find('i');
? ? ? ? ?源字符串str包括若干個i,第一個i出現(xiàn)的位置是1脆粥,所以上面的代碼返回就是1.如果要接著往后查找甫煞,可以為find指定第二個參數(shù),該參數(shù)表示起點位置偏移offset冠绢,例如;
? ? ? ? int pos = str.find('i',2);
? ? ? ? 第二個參數(shù)為2抚吠,表明從位置2開始查找,在查找到str[3]時fai按匹配弟胀,所以可以返回3.
? ? ? ? find可以直接查找一個子串楷力,例如:
? ? ? ? int pos = str.find("ing");
? ? ? ? 從左到右查找"ing",第一次匹配時返回子串首字符的位置以下代碼是在第一次查找的基礎(chǔ)上繼續(xù)往后查找相同字符串:
? ? ? ? int pos = str.find("ing",pos+3);
? ? ? ?rfind用于從右往左來查找字符或子串孵户,沒有匹配返回-1萧朝,有匹配則返回子串的首字符的位置。
? ? ? ?int pos = str.rfind("ing");
? ? ? ?pos = str.rfind("ing",pos-3);
6)substr
? ? ? ?substr用于復(fù)制部分字串夏哭,帶兩個參數(shù):第一個參數(shù)offset表示起始位置检柬,第二個參數(shù)len表示要截取的子串長度。第二個參數(shù)如果省略則表示一直截取到末尾竖配。
? ? ? str src("abcdefg");
? ? ? string str1 = src.substr(4); ? ? //返回efg
? ? ? string str2 = src.substr(4,2); ? ? //返回ef
7)insert/replace
? ? ? ?insert函數(shù)用于向字符串中間插入字符或子串何址。
string& ?insert(int pos,const char* str); ? ?//在pos出插入str
? ? ? replace用于替換string中間的一個資產(chǎn)src,替換另一個子串dest进胯。
? ? ? 如果要實現(xiàn)刪除子串用爪,也可以借助DoReplace函數(shù)來實現(xiàn),只是將目標(biāo)字串長度設(shè)為0罷了胁镐。