淺談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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/257656.html
標籤:其他
上一篇:設計模式(十八)——觀察者模式(JDK Observable原始碼分析)
下一篇:什么是旋轉陣列?圖文+代碼決議
