1、簡介
要使用 string 類,必須包含頭文件 <string>。string 庫提供了許多其他功能,如刪除字符串的部分或全部,用一個字符的部分或全部替換另一個字符串的部分或全部,插入、刪除字符串中數據,比較、提取、復制、交換等。
2、string類成員函數匯總
| 函數名稱 | 功能 |
|---|---|
| 構造函數 | 產生或復制字符串 |
| 析構函數 | 銷毀字符串 |
| =,assign | 賦以新值 |
| Swap | 交換兩個字符串的內容 |
| + =,append( ),push_back() | 添加字符 |
| insert () | 插入字符 |
| erase() | 刪除字符 |
| clear () | 移除全部字符 |
| resize () | 改變字符數量 |
| replace() | 替換字符 |
| + | 串聯字符串 |
| ==,! =,<,<=,>,>=,compare() | 比較字符串內容 |
| size(),length() | 返回字符數量 |
| max_size () | 返回字符的最大可能個數 |
| empty () | 判斷字符串是否為空 |
| capacity () | 返回重新分配之前的字符容量 |
| reserve() | 保留內存以存儲一定數量的字符 |
| [],at() | 存取單一字符 |
| >>,getline() | 從 stream 中讀取某值 |
| << | 將值寫入 stream |
| copy() | 將內容復制為一個 C - string |
| c_str() | 將內容以 C - string 形式返回 |
| data() | 將內容以字符數組形式返回 |
| substr() | 返回子字符串 |
| find() | 搜尋某子字符串或字符 |
| begin( ),end() | 提供正向迭代器支持 |
| rbegin(),rend() | 提供逆向迭代器支持 |
| get_allocator() | 返回配置器 |
3、String類的構造函數以及析構函數
常見的 string 類構造函數有以下幾種形式:
string strs ;//生成空字符串
string s(str);//生成字符串str的復制品
string s(str, stridx) ; //將字符串str中始於stridx的部分作為構造函數的初值
string s(str, strbegin, strlen); //將字符串str中始於strbegin、長度為strlen的部分作為字符串初值
string s(cstr);//以C_string類型cstr作為字符串s的初值
string s(cstr,char_len);//以C_string類型cstr的前char_len個字符串作為字符串s的初值
string s(num, c);//生成一個字符串,包含num個c字符
string s(strs, beg, end) ;//以區間[beg, end]內的字符作為字符串s的初值
析構函數如下:
~string() ; //銷毀所有內存,釋放內存
例1 string的構造
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string str ("12345678");
char ch[ ] = "abcdefgh";
string a; //定義一個空字符串
string str1 (str); //構造函數,全部復制
string str2 (str, 2, 5); //構造函數,從字符串str的第2個元素開始,復制5個元素,賦值給str_2
string str3 (ch, 5); //將字符串ch的前5個元素賦值給str_3
string str4 (5,'X'); //將 5 個 'X' 組成的字符串 "XXXXX" 賦值給 str_4
string str5 (str.begin(), str.end()); //復制字符串 str 的所有元素,並賦值給 str_5
cout << str << endl;
cout << a << endl ;
cout << str1 << endl;
cout << str2 << endl;
cout << str3 << endl;
cout << str4 << endl;
cout << str5 << endl;
return 0;
}
程序運行結果:
12345678
12345678
34567
abcde
XXXXX
12345678
## 4、獲取字符串長度 String 類型對象包括三種求解字符串長度的函數:``size()`` 和`` length()``、 ``maxsize() ``和`` capacity()``: - ``size() 和 length()``這兩個函數會返回 string 類型對象中的字符個數,且它們的執行效果相同。 - ``max_size() ``函數返回 string 類型對象最多包含的字符數。一旦程序使用長度超過 max_size() 的 string 操作,編譯器會拋出 length_error 異常。 - ``capacity()`` 該函數返回在重新分配內存之前,string 類型對象所能包含的最大字符數。
例2 string獲取長度
#include <iostream>
#include <string>
using namespace std;
int main ()
{
int size = 0;
int length = 0;
unsigned long maxsize = 0;
int capacity=0;
string str ("12345678");
string str_custom;
str_custom = str;
str_custom.resize (5);
size = str_custom.size();
length = str_custom.length();
maxsize = str_custom.max_size();
capacity = str_custom.capacity();
cout << "size = " << size << endl;
cout << "length = " << length << endl;
cout << "maxsize = " << maxsize << endl;
cout << "capacity = " << capacity << endl;
return 0;
}
程序運行結果:
size = 8
length = 8
maxsize = 2147483647
capacity = 15
## 5、獲取字符串元素 字符串中元素的訪問是允許的,一般可使用兩種方法訪問字符串中的單一字符:``下標操作符[] ``和 ``成員函數at()``。兩者均返回指定的下標位置的字符。第 1 個字符索引(下標)為 0,最后的字符索引為 length()-1。
需要注意的是,這兩種訪問方法是有區別的:
- 下標操作符 [] 在使用時不檢查索引的有效性,如果下標超出字符的長度范圍,會示導致未定義行為。對於常量字符串,使用下標操作符時,字符串的最后字符(即 '\0')是有效的。對應 string 類型對象(常量型)最后一個字符的下標是有效的,調用返回字符 '\0'。
- 函數 at() 在使用時會檢查下標是否有效。如果給定的下標超出字符的長度范圍,系統會拋出 out_of_range 異常。
例3 string獲取字符串元素
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s ("abcde");
char temp =0;
char temp_1 = 0;
temp = s [2]; //"獲取字符 'c'
temp_1 = s.at(2); //獲取字符 'c'
cout << temp << " " << temp_1 << std::endl;
return 0;
}
程序運行結果:
c c
## 6、字符串比較方法 string 類模板既提供了`` >、<、==、>=、<=、!= ``等比較運算符,還提供了 ``compare() ``函數,其中 ``compare() ``函數支持多參數處理,支持用索引值和長度定位子串進行比較。該函數返回一個整數來表示比較結果。如果相比較的兩個子串相同,compare() 函數返回 0,否則返回非零值。
1、compare()函數
函數原型:
int compare (const basic_string& s) const;
int compare (const Ch* p) const;
int compare (size_type pos, size_type n, const basic_string& s) const;
int compare (size_type pos, size_type n, const basic_string& s,size_type pos2, size_type n2) const;
int compare (size_type pos, size_type n, const Ch* p, size_type = npos) const;
例4 string比較之compare
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string A ("aBcdef");
string B ("AbcdEf");
string C ("123456");
string D ("123dfg");
//下面是各種比較方法
int m=A.compare (B); //完整的A和B的比較
int n=A.compare(1,5,B,4,2); //"Bcdef"和"AbcdEf"比較
int p=A.compare(1,5,B,4,2); //"Bcdef"和"Ef"比較
int q=C.compare(0,3,D,0,3); //"123"和"123"比較
cout << "m = " << m << ", n = " << n <<", p = " << p << ", q = " << q << endl;
cin.get();
return 0;
}
程序運行結果:
m = 1, n = -1, p = -1, q = 0
由此可知,string 類的比較 compare() 函數使用非常方便,而且能區分字母的大小寫。
2、比較運算符
String 類的常見運算符包括 >、<、==、>=、<=、!=。
例5 String比較之比較運算符
#include <iostream>
#include <string>
using namespace std;
void TrueOrFalse (int x)
{
cout << (x?"True":"False")<<endl;
}
int main ()
{
string S1 = "DEF";
string CP1 = "ABC";
string CP2 = "DEF";
string CP3 = "DEFG";
string CP4 ="def";
cout << "S1= " << S1 << endl;
cout << "CP1 = " << CP1 <<endl;
cout << "CP2 = " << CP2 <<endl;
cout << "CP3 = " << CP3 <<endl;
cout << "CP4 = " << CP4 <<endl;
cout << "S1 <= CP1 returned ";
TrueOrFalse (S1 <=CP1);
cout << "S1 <= CP2 returned ";
TrueOrFalse (S1 <= CP2);
cout << "S1 <= CP3 returned ";
TrueOrFalse (S1 <= CP3);
cout << "CP1 <= S1 returned ";
TrueOrFalse (CP1 <= S1);
cout << "CP2 <= S1 returned ";
TrueOrFalse (CP2 <= S1);
cout << "CP4 <= S1 returned ";
TrueOrFalse (CP4 <= S1);
cin.get();
return 0;
}
程序運行結果:
S1= DEF
CP1 = ABC
CP2 = DEF
CP3 = DEFG
CP4 = def
S1 <= CP1 returned False
S1 <= CP2 returned True
S1 <= CP3 returned True
CP1 <= S1 returned True
CP2 <= S1 returned True
CP4 <= S1 returned False
在使用時比較運算符時,對於參加比較的兩個字符串,任一個字符串均不能為 NULL,否則程序會異常退出。
## 7、字符串輸入輸出 字符串的輸入輸出直接用``cin``和``cout``就可以,但是``cin``在遇到空格后就會停止輸入,無法讀入帶有空格的字符串,讀入帶空格的字符串可以用``getline( cin ,str )``. 例6 String輸入輸出 ``` #include
123456
asdfgh klj
You inputed chars are: 123456
You inputed chars are: asdfgh
8、字符串查找函數
在 STL 中,字符串的查找功能可以實現多種功能,比如說:
- 搜索單個字符、搜索子串;
- 實現前向搜索、后向搜索;
- 分別實現搜索第一個和最后一個滿足條件的字符(或子串);
若查找 find() 函數和其他函數沒有搜索到期望的字符(或子串),則返回 npos;若搜索成功,則返回搜索到的第 1 個字符或子串的位置。其中,npos 是一個無符號整數值,初始值為 -1。當搜索失敗時, npos 表示“沒有找到(not found)”或“所有剩佘字符”。
值得注意的是,所有查找 find() 函數的返回值均是 size_type 類型,即無符號整數類型。該返回值用於表明字符串中元素的個數或者字符在字符串中的位置。
字符串有另一種查找為rfind()實現逆向查找。
find() 函數的原型主要有以下 4 種:
size_type find (value_type _Chr, size_type _Off = 0) const;
//find()函數的第1個參數是被搜索的字符、第2個參數是在源串中開始搜索的下標位置
size_type find (const value_type* _Ptr , size_type _Off = 0) const;
//find()函數的第1個參數是被搜索的字符串,第2個參數是在源串中開始搜索的下標位置
size_type find (const value_type* _Ptr, size_type _Off = 0, size_type _Count) const;
//第1個參數是被搜索的字符串,第2個參數是源串中開始搜索的下標,第3個參數是關於第1個參數的字符個數,可能是 _Ptr 的所有字符數,也可能是 _Ptr 的子串宇符個數
size_type find (const basic_string& _Str, size_type _Off = 0) const;
//第1個參數是被搜索的字符串,第2參數是在源串中開始搜索的下標位置
例7 string比較之查找
#include <iostream>
#include <string>
using namespace std;
int main(){
string x ("Hi, Peter, I'm sick. Please bought some drugs for me.");
int p = x.find('P');
int rp = x.rfind('P');
cout << "find()查找的P在第 " << p << " 位"<< endl;
cout << "rfind()查找的P在第 " << rp << " 位"<< endl;
int q = x.find("some",0);
int rq = x.rfind("some",0);
cout << "find()查找的some在第 " << q << " 位"<< endl;
cout << "rfind()查找的some在第 " << rq << " 位"<< endl;
int l = x.find (" drugs", 0, 5);
int rl = x.rfind (" drugs", 0, 5);
cout << "find()查找的' drugs'在第 " << l << " 位"<< endl;
cout << "rfind()查找的' drugs'在第 " << rl << " 位"<< endl;
string y ("sick");
int m = x.find (y, 0);
int rm = x.rfind (y, 0);
cout << "find()查找的y字符串在第 " << m << " 位"<< endl;
cout << "rfind()查找的y字符串在第 " << rm << " 位"<< endl;
return 0;
}
程序運行結果:
find()查找的P在第 4 位
rfind()查找的P在第 21 位
find()查找的some在第 35 位
rfind()查找的some在第 -1 位
find()查找的' drugs'在第 39 位
rfind()查找的' drugs'在第 -1 位
find()查找的y字符串在第 15 位
rfind()查找的y字符串在第 -1 位
string 類支持迭代器
string::iterator iterA = A.begin ();
