天天看點

算法學習之路|用C++刷算法會用到的STL(三)——string三、string

在C語言中,一般使用字元數組char str[]來存放字元串,很麻煩!在C++中加入了string類型,可以了解為元素為char型的vector,string對字元串的需求功能進行了封裝,使得操作簡單,不容易犯錯。

使用string需要添加的頭檔案是#include<string>(橋黑闆!!string.h(同cstring)和string是不一樣的頭檔案)。當然還要加上using namespace std;這一句的。

定義的方式和基本資料類型相同,在string後面加上變量名即可:

string str;

如果要初始化,可以直接給string類型的變量進行指派:

string str="abcd";

注:之前說過C++容器中有一對好基友,沒錯!就是string和vector,隻有他倆可以使用直接對疊代器進行加減某個數字,如str.begin()+3

即可以像通路char型數組一樣去通路string,比如:

#include<stdio.h>

#include<string>

string str="hahah";

printf("%c",str[2]);//輸出 h

但是要讀入和輸出整個字元串,則隻能用cin和cout:

[php]#include#include

using namespace std;

int main(){

}[/php]

因為string不像其他STL容器一樣需要參數,是以疊代器的定義很簡單:

string::iterator it;

這樣就得到了疊代器,并且可以通過*it來通路string中的每一位元素:

for(string::iterator it=str,begin();it!=str.end();it++){

printf("%c",*it);

}

(真的隻是基本操作,也是常用的,文末推薦幾個部落格,有更多騷操作!!!裡面寫的很詳細,感興趣的朋友可以深入研究,string真的很強大,之前說過,STL各個都是武林高手,身懷絕技的啊!)

這是string的加法,可以将兩個string直接拼起來!,比如:

string str1="i",str2="love you!",str3;

str3=str1+str2;//cout得到str3:i love you!(single dog 一萬點傷害(捂臉))

str1+=str2;//将str2直接拼接到str1上,得到str1:同上(捂臉)(捂臉)

簡單說一下,即兩個string類型可以直接使用==,!=,<=等比較大小,比較規則為字典序,從兩個string的首位開始比較,遇到不一樣的即按字典序比較傳回結果。但比如,str1="aa",str2="aaa",則是str1<str2,不多介紹,用的時候試一下就自然清楚啦。

可以認為兩個基本相同,時間複雜度都是O(1),傳回string的長度,即存放的字元數。比如,str=“aa",傳回2。

string的insert()函數寫法很多,實際上不隻insert,指派,連接配接,比較查找等函數都很多,自然,功能也很細節化,很完善,不常用,這裡隻介紹算法需要用到的,就上上文所說的,文末會推薦一個非常好的部落格,如果又需要,可以去仔細研究。

       string str="abc",str2="xyz";

       str.insert(1,str2);//結果str:axyzbc

string str="abcxyz",str2="opq";

str.insert(str.begin()+3,str2.begin(),str2.end());//橋黑闆!!再次強調,隻有vector和string這兩個好基友疊代器加數字的形式!!結果,str:abcopqxyz

删除單個元素:str.erase(it),it為需要删除的元素的疊代器。

删除一個區間内的所有元素:

str.erase(first,last),first未删除區間的起始疊代器,last為需要删除區間的末尾疊代器的下一個指針,也即[first,last)。

str.erase(pos,length),其中pos為需要删除的其實位置,length為删除的字元個數。

clear()用來清空string中的資料,時間複雜度O(1)。

substr()

substr(pos,len)傳回從pos号位開始,長度為len的子串,時間複雜度O(len)。(注:本文隻有it才是疊代器,pos是下标)

string::npos是一個常數,其本身的值為-1,但由于是unsigned_int類型,是以呢,實際上也可以認為是unsigned_int類型的最大值。string::npos用以作為find函數(如上文所述,find即查找函數非常多,詳見下文推薦部落格!)失配時的傳回值。可以認為string::npos等于-1或者4294967295。

C++ 标準庫中的string類型 支援可變長度的字元串,提供了很多有用的操作 标準庫将負責管理與存儲字元相關的記憶體。

平均來說 使用string類型的程式執行速度比C風格字元串快很多 而且不容易出錯 ;以前的很多地方C語言程式是用C語言風格字元串寫的 沒有用标準庫類型string 可能不具備有移植性 兩者都要掌握 現代C++程式員應更多地使用string。

處理“串”的問題。。。

來道題練練手:

<a href="https://www.patest.cn/contests/pat-a-practise/1060">PAT A1060. Are They Equal (25)</a>

注:題意不難,編碼較為複雜,但也是練string的好題目!加油吧

<a href="https://www.patest.cn/contests/pat-a-practise/1001">PAT A1001. A+B Format (20)</a>

繼續閱讀