淺談string
<string>
typedef basic_string<char> string;
本篇主要內容是簡單地介紹 string類 在競賽方面較實用的一些功能,可能滿足不了各大佬的需求
還是採用查字典的形式,右邊目錄速覽吧
一、迭代器
string
可以被歸為順序容器,有著和其他容器一樣的隨機訪問迭代器
(1)、begin
iterator begin();
返回指向string
的第一個字元的迭代器。
(2)、end
返回一個尾後迭代器,指向尾元素的下一個位置
二、功能型函式
(1)、size
size_t size();
返回字串的長度,順便提醒句,以位元組為單位
(2)、length
與(1)完全相同
(3)、clear
將當前容器的所有內容清空
(4)、empty
bool empty();
返回當前容器是否為空
三、元素訪問
(1)、[]
下標隨機訪問,它就是神!
簡單舉例:源字串每兩個字母之間有一個空格,要求只單獨輸出字母
#include <iostream>
using namespace std;
int main ( void )
{
string a = "a b c d e f";
for ( int i = 0; i < a.size(); i += 2 )
{
cout << a[i];
}
cout << endl;
return 0;
}
看看這優美的下標訪問,是不是有種可以立馬拋棄傳統的char陣列的感覺了
(2)、at
和下標訪問是一樣的,只不過更加安全,如果超出範圍,會返回out_of_range
異常
換成at
輸出以上程式:
#include <iostream>
using namespace std;
int main ( void )
{
string a = "a b c d e f";
for ( int i = 0; i < a.size(); i += 2 )
{
cout << a.at(i);
}
cout << endl;
return 0;
}
(3)、back
char& back();
返回對最後一個元素的引用,所以我們可以進行輸出或重寫操作
如果string
為空呢? 那此操作的行為是未定義的,否則不會丟擲異常
(4)、front
返回對首元素的引用
四、對string
新增修改的一些操作
(1)、+=
這個就太牛了,可以在當前值的末尾附加其他字元或字串來擴充套件字串
當然這意味著還有兩種操作
1、+
s1 + s2
返回s1
和s2
連線後的結果
還有一個,就是字面值也可以與string
物件加起來,注意:一定要保證加號至少連線了一個string
物件
s1 + "hello"
比如說!你不能寫成以下這樣!
s1 + ( "hello" + ", world" )
2、=
s1 = s2
用s2
的副本代替s1
中原來的字元
(2)、push_back
void push_back (char c);
將c
追加到字串的末尾,並將其長度自增1
(3)、pop_back
void pop_back();
刪除string
中的最後一個字元
如果string
中沒有任何元素,則該行為所產生的結果未定義
(4)、insert
啊,到較為複雜的環節了,我盡力弄得清楚點、、
引數型別 | 解釋 |
---|---|
pos |
在容器中插入新元素的位置,新元素將插入在position 的前面 (從0開始) |
str |
另一個string 物件 |
subpos |
str 中的起始位置。(從0開始) |
sublen |
要複製的子字串的長度 |
s |
指向字元陣列的指標(例如char陣列)。 |
c |
char 型別的值 |
p |
一個指向插入點的迭代器,將新內容插入到p 指向的字元之前。 |
n |
要插入的字元個數 |
first, last |
指定元素範圍的迭代器,將 [first,last)範圍內的所有元素副本插入到pos 的前面 |
il |
將列表元素{ } 內的值插入到pos 的前面 |
(1)插入str
的所有內容
string& insert (size_t pos, const string &str)
(2)插入str
的子字串(基於範圍)
string& insert (size_t pos, const string &str, size_t subpos, size_t sublen);
(3)插入C風格字串
string& insert (size_t pos, const char* s);
插入由s
指向的以空字元結束的字串(C風格的字串)
(4)插入基於範圍的C風格字串
string& insert (size_t pos, const char* s, size_t n);
(5)插入一段相同的字元
string& insert (size_t pos, size_t n, char c);
或者
void insert (iterator p, size_t n, char c);
插入 n 個字元 c
(6)插入單個字元
iterator insert (iterator p, char c);
(7)迭代器插入
void insert (iterator p, InputIterator first, InputIterator last);
插入[first,last)
所包含的字元
(8)插入元素值列表 { a, b, c, ... }
string& insert (const_iterator p, initializer_list<char> il);
insert,以上
(5)、erase
string& erase (size_t pos = 0, size_t len = npos);
抹去從 pos 開始,跨度為 len 個位元組長度,若無引數,則相當於預設引數,等於了執行成員函式clear
iterator erase (const_iterator p);
抹去 p 所指向的字元
iterator erase (const_iterator first, const_iterator last);
抹去由範圍迭代器所表示的區域
(6)、swap
void swap (string& str);
交換的是兩個容器的內部引數,交換過程非常高效,放心使用
對string
字串的處理
(1)、c_str
const char* c_str()
返回的是以空字元結束的字串(C風格的字串)
這個行為最好將返回值拷貝到一個char陣列中,因為如果更改string
,則返回的指標所表示的內容會被破壞
如:strcpy ( str, S.c_str() );
(2)、find
從前往後查詢子串或字元出現的位置。
1、size_t find (const string& str, size_t pos = 0)
從下標pos
開始查詢str
,返回str
所在的下標位置,找不到的話返回string::npos
2、size_t find (const char* s, size_t pos = 0)
一樣一樣,換成了C風格字串
3、size_t find (const char* s, size_t pos, size_t n)
取 s 中的前 n 個字元參與匹配,pos還是那個意思,從下標pos
開始查詢str
4、size_t find (char c, size_t pos = 0)
查詢單個字元在string
中的位置
(3)、rfind
從後往前查詢子串或字元出現的位置。
和find差不多嘛,留坑,等有空更
(4)、substr
string substr (size_t pos = 0, size_t len = npos) const;
返回一個子字串,子字串從原字串下標 pos 取 len 個長度產生的。
(5)、compare
這個挺牛的,有空更,先拿出定義
1、int compare (const string& str) const;
2、int compare (size_t pos, size_t len, const string& str) const;
3、int compare (size_t pos, size_t len, const string& str, size_t subpos, size_t sublen);
4、int compare (const char* s)
5、int compare (size_t pos, size_t len, const char* s)
6、int compare (size_t pos, size_t len, const char* s, size_t n)
五、成員常量
npos
static const size_t npos = -1;
即size_t
的最大值
作為返回值,通常用於表示沒有匹配項。
留在結尾的話
提醒自己:
-
未更如何構造
-
未更compare
-
未更 !=, ==, >, < 操作符的使用規則
-
未更 find 的其它函式如:find_first_of
引用:
[1]:http://c.biancheng.net/view/400.html
[2]:https://blog.csdn.net/qq_27848347/article/details/91284019
[3]:http://www.cplusplus.com/reference/string/string/?kw=string
推薦[4]:https://www.cnblogs.com/zpcdbky/p/4471454.html