C++ string類總結

我們以前處理字符串都是用char*,而當學了string之後,我們會果斷使用這個來處理字符串,因爲這個是真的很簡便啦!

目錄

string類的優點:

基礎篇:

聲明一個string字符串(代碼演示)

生成一個空字符串

爲字符串賦初值

用C語言裏的字符串s作爲str的初值

 生成一個字符串,包含n個字符c

 複製構造函數

 成員函數(字符串的容量)

獲取字符串的字符數

獲取可以處理的最大字符數

 /獲取字符串對象目前的容量

判斷字符串是否爲空

 清空字符串對象

調整字符串對象的大小

成員函數(操作字符串中的元素)

操作字符串中指定位置的字符

重點篇

字符串的連接(三種方法)

字符串的比較(兩種方法) 

字符串的查找(三種方法)

字符串的替換(三種方法) 

/字符串的插入(兩種方法)

 字符串的刪除

提取子串


string類的優點:

不用擔心內存是否夠用(即字符串的長度)

不用考慮字符串結尾的空白符(即'\0')

它可以很靈活的處理字符串操作,也可以作爲C++的數據類型。

基礎篇:

聲明一個string字符串(代碼演示):

//生成一個空字符串

string str;   //生成一個空字符串str

 

//爲字符串賦初值

 string str="1234567";

或string str("1234567");

//用C語言裏的字符串s作爲str的初值

string str(const char*s);

 

 //生成一個字符串,包含n個字符c

string str(size_type n,char c);   //假如 n=3,就相當於 str="ccc"

 //複製構造函數(const的作用是防止成員函數str改變str2的值

string str(const string &str2);   //將str2賦值給str,即str=str2

 成員函數(字符串的容量):

//獲取字符串的字符數

size();//等同於length

//獲取可以處理的最大字符數

 max_size();   //無論它是空字符串還是不是空字符串,最大字符數都是一樣的

 

可以看到這個數很大,也就是說對象str真的可以處理這麼多個字符,但是你的電腦未必有這麼大的內存可以給它保存這麼多個字符,所以這只是一個理論值。

 //獲取字符串對象目前的容量

capacity();  //單位是字符

可以看到size的值變了,但是容量沒有變。

原因:字符串的容量實際上就是字符串對象內部的數組的大小,而字符串對象修改字符串是需要時間給CPU運算的,每次都重新創建數組然後再修改的話,是非常低效率的,成員函數size()的作用就是獲取字符的數量,而成員函數capacity()的作用就是讓使用者知道,你的字符串對象的容量是這麼多,在這個大小的容量範圍內處理字符串是很快的,但是如果超過了這個容量的話,就需要重新創建一個更大容量的數組,並且大部分情況下,還要把舊數組中的數據複製到新數組中去,由於要複製數據,所以在字符串對象內部擴充容量的時候,CPU會有額外的運算,會額外消耗一點時間。所以簡單點說,就是這個容量一旦分配好,是不會輕易改變的,所以也儘量不要超過這個容量。

//判斷字符串是否爲空

empty();   //其功能就是如果沒有字符就返回1,有字符就返回0

 //清空字符串對象

clear();   //這裏有兩種清空方法

可以看到兩個字符串都被清空了。

//調整字符串對象的大小

resize(大小);  

resize(大小,字符);   //對於這種情況 string str3="12345";
                                                           str2.resize(10);  

                                                          //多出來的5個字符用字符類型的默認值(由於其內部是用char來保存字符的,所以字符類型的默認值就是char(),也就是數值0,對應的字符就是空字符)來填充 

 

成員函數(操作字符串中的元素): 

//操作字符串中指定位置的字符

at(位置);  //相當於[]

 但是用at訪問和用[]訪問還是有區別的。

區別:是否可以檢測越界

 可以看到:它沒有東西輸出並且正常的結束了,使用中括號是跟數組是一樣的,它們都不檢測是否越界

 

 可以看到:程序崩潰了,因爲成員函數at()可以檢測是否越界,在越界的時候拋出異常錯誤,讓程序直接崩潰結束掉,及時制止了錯誤蔓延出去,這樣可以防止出現更嚴重的問題。

具體什麼時候用哪個:因爲成員函數at()多了一步檢測是否越界的操作,所以它的執行速度會比中括號慢一些,當你寫代碼的時候已經判斷過是否越界,例如不修改字符串從第一個字符到最後一個字符循環訪問,這個就使用中括號,如果你不確定操作的位置是否越界,那麼就用at(),但是這種情況不多,一般像這種不確定的操作,在操作之前都是先用size()判斷一下,再使用中括號來訪問元素,所以使用成員函數at()的情況很少。

重點篇:

//字符串的連接(三種方法)

string &append(const char *s);

string &append(int n,char c);

string &append(const string &s);

 

//字符串的比較(兩種方法) 

int compare(const string &s) const;

int compare(const char *s) const;

//字符串的查找(三種方法)

int find(char c,int pos=0) const;

int find(const char *s,int pos=0) const;

int find(const string &s,int pos=0) const;

//其中的pos爲從這個位置(在這裏是下標爲0的位置,即第1個字符的位置)開始往後查找 

 

//字符串的替換(三種方法) 

string &replace(int p0,int n0,const char *s);//

string &replace(int p0,int n0,int n,char c);

string &replace(int p0,int n0,const string &s);

//p0表示從該位置(p0只是下標)開始刪除n0個字符,然後將字符串替換到這個位置

 

 //字符串的插入(兩種方法)

string &insert(int p0,const char *s);

string &insert(int p0,const string &s);

//在p0(p0只是下標)的位置,插入字符串

 

 //字符串的刪除

string &erase(int pos=0,int n=npos);

//從pos位置(pos只是下標,在這裏是從第1個位置開始)開始刪除n個字符

那個,代碼上的那個“第一種“是忘刪了哈,可別被這小錯誤給干擾了。 

//提取子串

string substr(int pos=0,int n=npos) const;

//即從pos位置(pos只是下標,在這裏是從第1個位置開始)位置開始提取出來n個字符 

 

 

發佈了22 篇原創文章 · 獲贊 26 · 訪問量 8496
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章