我們以前處理字符串都是用char*,而當學了string之後,我們會果斷使用這個來處理字符串,因爲這個是真的很簡便啦!
目錄
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個字符