bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

C++STL之string的使用-創(chuàng)新互聯(lián)

對于C語言中的字符串,我們只能使用char類型數(shù)組保存,并且是以'\0'結(jié)尾的.

成都創(chuàng)新互聯(lián)公司主營德令哈網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都app開發(fā),德令哈h5小程序定制開發(fā)搭建,德令哈網(wǎng)站營銷推廣歡迎德令哈等地區(qū)企業(yè)咨詢

操作起來非常不方便而且底層空間需要用戶自己訪問,非常造成容易越界訪問.

這個時候,C++的STL中的string類就很好解決了這些.

目錄

string的使用

1.string類對象的常見構(gòu)造

2. string類對象的容量操作

3. string類對象的訪問及遍歷操作

4. string類對象的修改操作

5.string類非成員函數(shù)


string的使用

string的使用主要是使用一些接口,下面將列出一些常用的接口使用.

1.string類對象的常見構(gòu)造

當(dāng)我們用string初始化對象時,可采用以下方法:

string()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??構(gòu)造空的string類對象,即空字符串

string(const char* s)? ? ? ? ? ? ? ? ? ?用C-string來構(gòu)造string類對象

string(size_t n,char c)? ? ? ? ? ? ? ? ?string類對象中包含n個字符c

string(const string& s)? ? ? ? ? ? ? ??拷貝構(gòu)造函數(shù)

看下列代碼

void Teststring()
{
	string s1; // 構(gòu)造空的string類對象s1
	string s2("hello hmylq"); // 用C格式字符串構(gòu)造string類對象s2,即包含'\0'
	string s3(s2); // 拷貝構(gòu)造s3
}

來分別看一下它們的值

這樣就成功初始化了.

與從同時初始化的方法還有一種,就是賦值運算符重載"=",也可以進行初始化.

string s = "lqhmy";
2. string類對象的容量操作

size(重點)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??返回字符串有效字符長度
length ????????????????????????????????????????????????返回字符串有效字符長度
capacity ????????????????????????????????????????????返回空間總大小
empty (重點)???????????????????????????????? 檢測字符串釋放為空串,是返回true,否則返回false
clear (重點) ?????????????????????????????????? 清空有效字符
reserve (重點)???????????????????????????? ? 為字符串預(yù)留空間
resize (重點)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 將有效字符的個數(shù)該成n個,多出的空間用字符c填充


void Teststring()
{
	// 注意:string類對象支持直接用cin和cout進行輸入和輸出
	string s("hello, hmylq!");
	cout<< s.size()<< endl;
	cout<< s.length()<< endl;
	cout<< s.capacity()<< endl;
	cout<< s<< endl; 
}

capacity為當(dāng)前底層空間容量,而size和length為當(dāng)前字符串大小.

可以看到已經(jīng)將字符串s的大小輸出出來了.


void Teststring()
{
	string s("hello, hmylq!");
	// 將s中的字符串清空,注意清空時只是將size清0,不改變底層空間的大小
	s.clear();
	cout<< s.size()<< endl;
	cout<< s.capacity()<< endl;
}

此時clear是將字符串清空,大小變?yōu)?,但是容量不會改變.


void Teststring()
{
	string s("hello, hmylq!");
	// 將s中的字符串清空,注意清空時只是將size清0,不改變底層空間的大小
	s.clear();
	// 將s中有效字符個數(shù)增加到10個,多出位置用'a'進行填充
	// “aaaaaaaaaa”
	s.resize(10, 'a');
    cout<< s.size()<< endl;
	cout<< s.size()<< endl;
	cout<< s.capacity()<< endl;
}

注意是將有效字符增加到10個,并不是容量!

可以看到resize已經(jīng)成功把10個字符用’a'進行了填充.

resize還有注意的是,如果第二個參數(shù)不給值,會默認(rèn)缺省值為'\0'

看下面的例子

void Teststring()
{
	string s("hello, hmylq!");
	// 將s中的字符串清空,注意清空時只是將size清0,不改變底層空間的大小
	s.clear();
	// 將s中有效字符個數(shù)增加到10個,多出位置用'a'進行填充
	// “aaaaaaaaaa”
	s.resize(10, 'a');
	// 將s中有效字符個數(shù)增加到15個,多出位置用缺省值'\0'進行填充
	// "aaaaaaaaaa\0\0\0\0\0"
	// 注意此時s中有效字符個數(shù)已經(jīng)增加到15個
	s.resize(15);
	cout<< s.size()<< endl;
	cout<< s.capacity()<< endl;
	cout<< s<< endl;
}

此時雖然字符串顯示的是10個‘a(chǎn)',但是有效字符長度已經(jīng)到了15,再向后插入字符將會在第16個字符進行插入.


void Teststring()
{
	string s("hello, hmylq!");
	// 將s中的字符串清空,注意清空時只是將size清0,不改變底層空間的大小
	s.clear();

	s.resize(10, 'a');
	// 將s中有效字符個數(shù)縮小到5個
	s.resize(5);
	cout<< s.size()<< endl;
	cout<< s.capacity()<< endl;
	cout<< s<< endl;
}

可以看到有效長度已經(jīng)縮小到了5個,但是總?cè)萘繘]有變化,而且這次是將有效字符長度縮小,所以會將多余的字符舍棄掉,只會留下前5個字符.


reserve

void Teststring()
{
	string s;
	// 測試reserve是否會改變string中有效元素個數(shù)
	s.reserve(100);
	cout<< s.size()<< endl;
	cout<< s.capacity()<< endl;
}

來看結(jié)果

可以看到reserve并沒有改變size即有效元素的個數(shù),只改變了容量大小,但我們開辟了100個空間,但為什么容量是111呢?

其實系統(tǒng)開辟空間默認(rèn)是15個字節(jié),當(dāng)不滿足需求時,將每次以1.5倍的速度擴容,直到大于或者等于指定的容量.


void Teststring()
{
	string s;

	s.reserve(100);
	// 測試reserve參數(shù)小于string的底層空間大小時,是否會將空間縮小
	s.reserve(50);
	cout<< s.size()<< endl;
	cout<< s.capacity()<< endl;
}

結(jié)果如下:

可以看到空間并不會縮小,依然是111.

與此同時有需要注意的幾個點如下:

1. size()與length()方法底層實現(xiàn)原理完全相同,引入size()的原因是為了與其他容器的接口保持一致,一般情況下基本都是用size()。
2. clear()只是將string中有效字符清空,不改變底層空間大小。
3. resize(size_t n) 與 resize(size_t n, char c)都是將字符串中有效字符個數(shù)改變到n個,不同的是當(dāng)字符個數(shù)增多時:resize(n)用0來填充多出的元素空間,resize(size_t n, char c)用字符c來填充多出的元素空間。注意:resize在改變元素個數(shù)時,如果是將元素個數(shù)增多,可能會改變底層容量的大小,如果是將元素個數(shù)減少,底層空間總大小不變。
4. reserve(size_t res_arg=0):為string預(yù)留空間,不改變有效元素個數(shù),當(dāng)reserve的參數(shù)小于string的底層空間總大小時,reserver不會改變?nèi)萘看笮 ?/p>

3. string類對象的訪問及遍歷操作

operator[] (重點)? ? ? ? ? ? 返回pos位置的字符,const string類對象調(diào)用
begin+ end? ? ? ? ? ? ? ? ? ? ? ? begin獲取一個字符的迭代器 + end獲取最后一個字符下一個位置的迭代器
rbegin + rend? ? ? ? ? ? ? ? ? ? ?rbegin獲取最后一個字符的迭代器 + rend獲取第一個字符前一個位置的迭代器

范圍for C++11支持更簡潔的范圍for的新遍歷方式


void Teststring()
{
	string s1("hello lq");
	const string s2("Hello hmy");
	cout<< s1<< " "<< s2<< endl;
	cout<< s1[0]<< " "<< s2[0]<< endl;
	s1[0] = 'H';
	cout<< s1<< endl;

	// s2[0] = 'h'; 代碼編譯失敗,因為const類型對象不能修改
}

可以看到我們直接用下標(biāo)訪問到string類中的第0個字符,當(dāng)然還可以是別的下標(biāo)位置.

獲取到之后不僅可以使用,還可以進行修改.

例如我們將s1中的第一個字符'h'改成了'H'.

非常的方便.


下面說string的遍歷.

一共有三種方法:

需要注意的以下三種方式除了遍歷string對象,還可以遍歷時修改string中的字符,
另外以下三種方式對于string而言,第一種使用最多

1.for+operator[]

for (size_t i = 0; i< s.size(); ++i)
		cout<< s[i]<< endl

2.迭代器

string::iterator it = s.begin();
    while(it != s.end())
    {
        cout<<*it<

3.范圍for

for(auto& ch : s)
    {
        cout<< ch<< endl;
    }

4. string類對象的修改操作

push_back ??????????????????在字符串后尾插字符c
append ???????????????????????在字符串后追加一個字符串
operator+= (重點)????????在字符串后追加字符串str
c_str(重點) ?????????????????返回C格式字符串
find + npos(重點) ???????從字符串pos位置開始往后找字符c,返回該字符在字符串中的位置
rfind? ? ? ? ? ? ? ? ? ? ? ? ? ? 從字符串pos位置開始往前找字符c,返回該字符在字符串中的位置
substr ????????????????????????在str中從pos位置開始,截取n個字符,然后將其返回


接下來看各接口的使用

void Teststring()
{
	string str;
	str.push_back(' '); // 在str后插入空格
	str.append("hello"); // 在str后追加一個字符"hello"
	str += 'h'; // 在str后追加一個字符'h'
	str += "lq"; // 在str后追加一個字符串"lq"
	cout<< str<< endl;
	cout<< str.c_str()<< endl; // 以C語言的方式打印字符串
}

看輸出結(jié)果

可以發(fā)現(xiàn)都已經(jīng)成功插入了

在string中push_back只能插入字符,append只能追加字符串,當(dāng)然字符串可以是一個字母.

而+=既可以插入字符也可以插入字符串,所以我們平常使用+=居多.


void Teststring()
{
	// 獲取file的后綴
	string file("string.cpp");
	size_t pos = file.rfind('.');
	string suffix(file.substr(pos, file.size() - pos));
	cout<< suffix<< endl;
}

我們都知道文件后綴是以 . 結(jié)尾

我們想獲取文件的后綴名,首先要先找到.的位置,利用find或者rfind(這里使用rfind因為.一般都是偏后,所以是從后向前找),然后如果找到了,會返回這個位置的下標(biāo),否則返回npos,然后我們想獲取.后面的內(nèi)容,可以利用substr切取子串,從第6個位置開始,向后截取(總大小-6)個長度,即.后面的長度,這樣就可以獲得了.

其中的npos 是string中的一個靜態(tài)成員變量????????

static const size_t npos = -1;

void Teststring()
{
	// 取出url中的域名
	string url("http://www.cplusplus.com/reference/string/string/find/");
	cout<< url<< endl;
	size_t start = url.find("://");
	//如果start等于了npos,說明沒有找到,即這個url是非法的.
	if (start == string::npos)
	{
		cout<< "invalid url"<< endl;
		return;
	}
	//如果找到了,因為此時位置是在':'這個位置,所以必須將這個位置+=3跳過這個位置,此時的位置在"://www"中的第一個w位置
	start += 3;
	//然后開始尋找第一個/位置
	size_t finish = url.find('/', start);
	//此時從start到finsh之間的東西就是我們所需要的url域名
	string address = url.substr(start, finish - start);
	cout<< address<< endl;
}

上面的就是取出url域名的操作了

在這個操作中需要注意的是:

1. 在string尾部追加字符時,s.push_back(c) / s.append(1, c) / s += 'c'三種的實現(xiàn)方式差不多,一般情況下string類的+=操作用的比較多,+=操作不僅可以連接單個字符,還可以連接字符串。
2. 對string操作時,如果能夠大概預(yù)估到放多少字符,可以先通過reserve把空間預(yù)留好。

5.string類非成員函數(shù)

operator+ ???????????????????????????????????????盡量少用,因為傳值返回,導(dǎo)致深拷貝效率低
operator>>?????????????????? ? ? (重點) 輸入運算符重載
operator<relational operators(>,>=,<,<=,==)? ? ? ? ? ? ? ? ? ? ?(重點) 大小比較

這里前三個前面已經(jīng)說過了,主要說一下最后一個,就是字符串可以利用大于、小于、等于號等進行比較(按字典序比較)

void Teststring()
{
	string s1("abcde");
	string s2("bcdef");
	if (s1 >s2)
		cout<< "s1 >s2"<< endl;
	else if (s1< s2)
		cout<< "s1< s2"<< endl;
	else
		cout<< "s1 == s2"<< endl;
		
}

結(jié)果應(yīng)當(dāng)是s1

符合了我們預(yù)期的結(jié)果.

這里想說明字符串可以直接利用運算符進行比較大小.

stl的string的使用就到此結(jié)束了,下一章將詳細(xì)講述它的模擬實現(xiàn).

如果有疑問或者錯誤的地方,歡迎提出或指正哦.

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)站題目:C++STL之string的使用-創(chuàng)新互聯(lián)
網(wǎng)址分享:http://vcdvsql.cn/article24/ppjje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站微信小程序網(wǎng)站建設(shè)定制開發(fā)服務(wù)器托管建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)