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

kissjz發表於2018-02-09

三、string

1.string的自我介紹

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

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

2.string的定義

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

string str;

如果要初始化,可以直接給string型別的變數進行賦值:

string str=”abcd”;

3.string容器內元素的訪問形式

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

 <li>通過下標訪問

即可以像訪問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(){

string str;
cin>>str;
cout<<str;//相當於,printf("%s
",str.c_str());即將string型別用c_str()變為字元陣列
return 0;//並不推薦第二種寫法!瞭解即可

}[/php]

 <li>通過迭代器訪問

因為string不像其他STL容器一樣需要引數,因此迭代器的定義很簡單:
string::iterator it;
這樣就得到了迭代器,並且可以通過*it來訪問string中的每一位元素:
for(string::iterator it=str,begin();it!=str.end();it++){
printf(“%c”,*it);
}

4.string中的基本操作

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

(1)operator+=

這是string的加法,可以將兩個string直接拼起來!,比如:
string str1=”i”,str2=”love you!”,str3;
str3=str1+str2;//cout得到str3:i love you!(single dog 一萬點傷害(捂臉))
str1+=str2;//將str2直接拼接到str1上,得到str1:同上(捂臉)(捂臉)

(2)compare operator

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

(3)lenth()/size()

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

(4)insert()

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

 <li><em>insert(pos,string),</em>在pos號位置插入字串string。</li>

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

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

 <li><em>intsert(it,it2,it3)</em>,it為原字串欲插入的位置,it2和it3為待插入字串的首位迭代器,用來表示串[it2,it3)將被插在it的位置上,比如:

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

(5)erase()

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

刪除一個區間內的所有元素:

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

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

(6)clear()

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

substr()

substr(pos,len)返回從pos號位開始,長度為len的子串,時間複雜度O(len)。(注:本文只有it才是迭代器,pos是下標

(7)string::npos

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

(8)find()

 <li>str.find(str2),當str2是str的子串時,返回其在str中第一次出現的位置;如果str2不是str的子串,那麼返回上文提到的string::npos(也就是-1和那個無符號整型的最大值啦)。</li>
 <li>str.find(str2,pos),從str的pos號位開始匹配str2,返回值同上。時間複雜度為O(nm),n,m為str,str2的長度。</li>

(9)replace()

 <li><em>str.replace(pos,len,str2)</em>把str從pos號位開始,長度為len的子串替換為str2。</li>
 <li><em>str.replace(it1,it2,str2)</em>把str的迭代器[it1,it2)範圍的子串換為str2。</li>
 <li>時間複雜度<em>O(str.length())</em>。</li>

5.string的優良特性

C++ 標準庫中的string型別 支援可變長度的字串,提供了很多有用的操作 標準庫將負責管理與儲存字元相關的記憶體。
平均來說 使用string型別的程式執行速度比C風格字串快很多 而且不容易出錯 ;以前的很多地方C語言程式是用C語言風格字串寫的 沒有用標準庫型別string 可能不具備有移植性 兩者都要掌握 現代C++程式設計師應更多地使用string。

6.string的用途

處理“串”的問題。。。

來道題練練手:

PAT A1060. Are They Equal (25)

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

PAT A1001. A+B Format (20)

注:此題解法很巧妙,簡潔,推薦66姐的部落格1001. A+B Format (20)-PAT甲級真題

參考:《演算法筆記》(胡凡,曽磊)

推薦部落格:標準C++中的string類的用法總結

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


相關文章