演算法學習之路|用C++刷演算法會用到的STL(三)——string
三、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的好題目!加油吧
注:此題解法很巧妙,簡潔,推薦66姐的部落格1001. A+B Format (20)-PAT甲級真題
推薦部落格:標準C++中的string類的用法總結
。
相關文章
- 演算法學習之路|用C++刷演算法會用到的STL(一)——vector演算法C++
- 演算法學習之路|用C++刷演算法會用到的STL(二)——set演算法C++
- 演算法學習之路|划拳演算法
- C++ STL演算法總結C++演算法
- 【演算法學習】STL庫 大小根堆的用法演算法
- 演算法學習之路|A除以B演算法
- 演算法學習之路|列印排名演算法
- 演算法學習之路|方格分割演算法
- 演算法學習之路|朋友數演算法
- 演算法學習之路|SpellItRight演算法
- 演算法學習之路|歐幾里得遊戲演算法遊戲
- 演算法學習之路|月餅演算法
- 演算法學習之路|PATRanking演算法
- 演算法學習之路|列印沙漏演算法
- 演算法學習之路|快速排序演算法排序
- 演算法學習之路|結繩演算法
- 演算法學習之路|數零壹演算法
- C++ STL學習——vectorC++
- 演算法學習之路|開學寄語演算法
- 演算法學習之路|說反話演算法
- 演算法學習之路|幼兒園買玩具演算法
- 演算法學習之路|小賭怡情演算法
- 演算法學習之路|影像過濾演算法
- 演算法學習之路|日期問題演算法
- 演算法學習之路|賣個萌演算法
- 演算法學習之路|螺旋矩陣演算法矩陣
- 演算法學習之路|選擇題演算法
- 演算法學習之路|字元統計演算法字元
- C++ STL學習之stack。C++
- 演算法學習之路|最小生成樹——prime演算法演算法
- EM演算法學習(三)演算法
- 演算法學習之路|科學計數法演算法
- 演算法學習之路|PlayOnWords(尤拉道路+dfs)演算法
- 演算法學習之路|舊鍵盤打字演算法
- 演算法學習之路|最簡分數演算法
- 演算法學習之路|檢驗身份證演算法
- 演算法學習之路|愛丁頓數演算法
- 跟我學C++中級篇——STL的學習C++