在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>
。