C++ string (淺談)

Jude_Zhang發表於2021-02-07

淺談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

返回s1s2連線後的結果

還有一個,就是字面值也可以與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