STL--String類(lèi)

string 類(lèi)提供的各種操作函數(shù)大致分為八類(lèi):構(gòu)造器和析構(gòu)器、大小和容量强胰、元素存取舱沧、字 符串比較、字符串修改偶洋、字符串接合熟吏、I/O 操作以及搜索和查找。


構(gòu)造函數(shù)有四個(gè)參數(shù)玄窝,其中三個(gè)具有默認(rèn)值牵寺。要初始化一個(gè) string 類(lèi),可以使用 C 風(fēng)格字符串或 string 類(lèi)型對(duì)象恩脂,也可以使用 C 風(fēng)格字符串的部分或 string 類(lèi)型對(duì)象的部分或序列缸剪。

注意,不能使用字符或者整數(shù)去初始化字符串东亦。

常見(jiàn)的 string 類(lèi)構(gòu)造函數(shù)有以下幾種形式:

string strs //生成空字符串
string s(str) //生成字符串str的復(fù)制品
string s(str, stridx) //將字符串str中始于stridx的部分作為構(gòu)造函數(shù)的初值
string s(str, strbegin, strlen) //將字符串str中始于strbegin杏节、長(zhǎng)度為strlen的部分作為字符串初值
string s(cstr) //以C_string類(lèi)型cstr作為字符串s的初值
string s(cstr,char_len) //以C_string類(lèi)型cstr的前char_len個(gè)字符串作為字符串s的初值
strings(num, c) //生成一個(gè)字符串唬渗,包含num個(gè)c字符
strings(strs, beg, end) //以區(qū)間[beg, end]內(nèi)的字符作為字符串s的初值

析構(gòu)函數(shù)的形式如下:

~string() //銷(xiāo)毀所有內(nèi)存,釋放內(nèi)存

如果字符串只包含一個(gè)字符奋渔,使用構(gòu)造函數(shù)對(duì)其初始化時(shí)镊逝,使用以下兩種形式比較合理:

std::string s('x'); //錯(cuò)誤

std::string s(1, 'x'); //正確
std::string s("x"); //正確

C_string 一般被認(rèn)為是常規(guī)的 C++ 字符串。目前嫉鲸,在 C++ 中確實(shí)存在一個(gè)從 const char * 到 string 的隱式型別轉(zhuǎn)換撑蒜,卻不存在從 string 對(duì)象到 C_string 的自動(dòng)型別轉(zhuǎn)換。對(duì)于 string 類(lèi)型的字符串玄渗,可以通過(guò) c_str() 函數(shù)返回該 string 類(lèi)對(duì)象對(duì)應(yīng)的 C_string座菠。

通常,程序員在整個(gè)程序中應(yīng)堅(jiān)持使用 string 類(lèi)對(duì)象藤树,直到必須將內(nèi)容轉(zhuǎn)化為 char* 時(shí)才將其轉(zhuǎn)換為 C_string浴滴。

#include <iostream>
#include <string>
using namespace std;

int main ()
{
    string str ("12345678");
    char ch[ ] = "abcdefgh";
    string a; //定義一個(gè)空字符串
    string str_1 (str); //構(gòu)造函數(shù),全部復(fù)制
    string str_2 (str, 2, 5); //構(gòu)造函數(shù)岁钓,從字符串str的第2個(gè)元素開(kāi)始升略,復(fù)制5個(gè)元素,賦值給str_2
    string str_3 (ch, 5); //將字符串ch的前5個(gè)元素賦值給str_3
    string str_4 (5,'X'); //將 5 個(gè) 'X' 組成的字符串 "XXXXX" 賦值給 str_4
    string str_5 (str.begin(), str.end()); //復(fù)制字符串 str 的所有元素屡限,并賦值給 str_5
    cout << str << endl;
    cout << a << endl ;
    cout << str_1 << endl;
    cout << str_2 << endl;
    cout << str_3 << endl;
    cout << str_4 << endl;
    cout << str_5 << endl;
    return 0;
}

1.賦值
=,assign()

string a;
a.assign("bbb");
string a="bbb";

從鍵盤(pán)賦值:
cin>>a;以空格作為結(jié)束
getline(cin,a);以回車(chē)作為結(jié)束

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string str1 ("123456");
    string str;
    str.assign (str1); //直接賦值
    cout << str << endl;
    str.assign (str1, 3, 3); //賦值給子串
    cout << str << endl;
    str.assign (str1,2,str1.npos);//賦值給從位置 2 至末尾的子串
    cout << str << endl;
    str.assign (5,'X'); //重復(fù) 5 個(gè)'X'字符
    cout << str << endl;
    string::iterator itB;
    string::iterator itE;
    itB = str1.begin ();
    itE = str1.end();
    str.assign (itB, (--itE)); //從第 1 個(gè)至倒數(shù)第 2 個(gè)元素品嚣,賦值給字符串 str
    cout << str << endl;
    return 0;
}

2.交換兩個(gè)字符串的內(nèi)容
swap(string a,string b);

3.添加字符
a+=ba.append(string b);

4.插入字符
a.insert(位置下標(biāo)钧大,要插入的字符串);

5.刪除字符
a.erase(要?jiǎng)h除的字符的位置下標(biāo))翰撑;
a.erase(要?jiǎng)h除子串的起始位置下標(biāo), 子串的長(zhǎng)度);

6.移除全部字符
賦空串a=""a.clear()//后者在VC6下不可以使用

7.改變字符串?dāng)?shù)量
resize()調(diào)整容器中有效數(shù)據(jù)區(qū)域的尺寸,如果尺寸變小,原來(lái)數(shù)據(jù)多余的截掉;如果尺寸變大,不夠的數(shù)據(jù)用該函數(shù)的第二個(gè)參數(shù)填充碍遍,因此會(huì)影響size()。
string a="jessy"; a.resize(10,'b');

8.替換字符串
a.replace(起始位置咆爽,長(zhǎng)度巩踏,新的字符串)

9.串聯(lián)字符串
+

10.比較字符串內(nèi)容
== != < <= > >= compare()
a.compare(b)
如果在使用 compare() 函數(shù)時(shí),參數(shù)中出現(xiàn)了位置和大小靠闭,比較時(shí)只能用指定的子串帐我。例如:
s.compare {pos,n, s2);
若參與比較的兩個(gè)串值相同,則函數(shù)返回 0愧膀;若字符串 S 按字典順序要先于 S2拦键,則返回負(fù)值;反之檩淋,則返回正值

#include <iostream>
#include <string>
using namespace std;
int main ()
{
    string A ("aBcdef");
    string B ("AbcdEf");
    string C ("123456");
    string D ("123dfg");
    //下面是各種比較方法
    int m=A.compare (B); //完整的A和B的比較
    int n=A.compare(1,5,B,4,2); //"Bcdef"和"AbcdEf"比較
    int p=A.compare(1,5,B,4,2); //"Bcdef"和"Ef"比較
    int q=C.compare(0,3,D,0,3); //"123"和"123"比較
    cout << "m = " << m << ", n = " << n <<", p = " << p << ", q = " << q << endl;
    cin.get();
    return 0;
}

11.返回字符數(shù)量
a.size() a.length()

12.返回字符的最大可能個(gè)數(shù)
a.max_size();

13.判斷字符串是否為空
a.empty();

14.返回重新分配之前的字符容量
a.capacity()

15.保留內(nèi)存以存儲(chǔ)一定量的字符
a.reserve(大小)
并沒(méi)有實(shí)際分配內(nèi)存芬为,影響capacity()

16.將內(nèi)容復(fù)制為一個(gè)C-string
a.copy(p,n,size_type_Off=0);
從string對(duì)象中至多復(fù)制n個(gè)字符到字符指針p指向的空間中萄金。默認(rèn)從首字符開(kāi)始。copy不會(huì)申請(qǐng)分配空間媚朦,所以用戶(hù)要確保p指向的空間足夠保存n個(gè)字符氧敢。

17.將內(nèi)容以 C - string 形式返回
c_str();
返回一個(gè)指向某字符串的指針。

#include<iostream>
#include<string>
using namespace std;

int main()
{
    const char* b;
    string a="haha";
    b=a.c_str();
    cout<<b<<endl;//輸出:haha
    a="pupu";
    cout<<b<<endl;//輸出:pupu
    return 0;
}

18.將內(nèi)容以字符數(shù)組形式返回
data()
與c_str()類(lèi)似询张,但是返回的數(shù)組不以空字符終止孙乖。

#include<iostream>
#include<string>
using namespace std;

int main()
{
    const char* b;
    string a="haha";
    b=a.data();
    cout<<b[3];
    return 0;
}

19.返回子字符串
a.substr(start,end);

20.搜尋某子字符串或字符

string str1,str2;
char c;

//從str1中查找str2,返回str2中首個(gè)字符在str1中的地址
str1.find(str2);
str1.find(str2,5);

//在str1中查找字符c并返回第一個(gè)查找到的地址
str1.find(c);

//在str1中的第2個(gè)字符開(kāi)始查找str2的前兩個(gè)字符份氧,并返回str2的首字符在str1中的位置
str1.find(str2,2,2);

rfind() 函數(shù)的原型和find()函數(shù)的原型類(lèi)似唯袄,參數(shù)情況也類(lèi)似。只不過(guò) rfind() 函數(shù)適用于實(shí)現(xiàn)逆向查找
find_first_of()函數(shù)可實(shí)現(xiàn)在源串中搜索某字符串的功能蜗帜,該函數(shù)的返回值是被搜索字符串的第 1 個(gè)字符第 1 次出現(xiàn)的下標(biāo)(位置)恋拷。若查找失敗,則返回 npos钮糖。
find_last_of()函數(shù)同樣可實(shí)現(xiàn)在源串中搜索某字符串的功能梅掠。與 find_first_of() 函數(shù)所不同的是,該函數(shù)的返回值是被搜索字符串的最后 1 個(gè)字符的下標(biāo)(位置)店归。若查找失敗阎抒,則返回 npos。
find_first_not_of() 函數(shù)可實(shí)現(xiàn)在源字符串中搜索與指定字符(串)不相等的第 1 個(gè)字符
find_last_not_of()函數(shù)可實(shí)現(xiàn)在源字符串中搜索與指定字符(串)不相等的最后 1 個(gè)字符消痛。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末且叁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子秩伞,更是在濱河造成了極大的恐慌逞带,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纱新,死亡現(xiàn)場(chǎng)離奇詭異展氓,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)脸爱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)遇汞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人簿废,你說(shuō)我怎么就攤上這事空入。” “怎么了族檬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵歪赢,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我单料,道長(zhǎng)埋凯,這世上最難降的妖魔是什么点楼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮递鹉,結(jié)果婚禮上盟步,老公的妹妹穿的比我還像新娘。我一直安慰自己躏结,他們只是感情好却盘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著媳拴,像睡著了一般黄橘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屈溉,一...
    開(kāi)封第一講書(shū)人閱讀 51,727評(píng)論 1 305
  • 那天塞关,我揣著相機(jī)與錄音,去河邊找鬼子巾。 笑死帆赢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的线梗。 我是一名探鬼主播椰于,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼仪搔!你這毒婦竟也來(lái)了瘾婿?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤烤咧,失蹤者是張志新(化名)和其女友劉穎偏陪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體煮嫌,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡笛谦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了昌阿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饥脑。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖宝泵,靈堂內(nèi)的尸體忽然破棺而出好啰,到底是詐尸還是另有隱情轩娶,我是刑警寧澤儿奶,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站鳄抒,受9級(jí)特大地震影響闯捎,放射性物質(zhì)發(fā)生泄漏椰弊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一瓤鼻、第九天 我趴在偏房一處隱蔽的房頂上張望秉版。 院中可真熱鬧,春花似錦茬祷、人聲如沸清焕。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秸妥。三九已至,卻和暖如春沃粗,著一層夾襖步出監(jiān)牢的瞬間粥惧,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工最盅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留突雪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓涡贱,卻偏偏與公主長(zhǎng)得像咏删,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盼产,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容