最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一起來(lái)看看C++STL容器之string類

 更新時(shí)間:2022年03月07日 10:25:00   作者:長(zhǎng)大Leslie  
這篇文章主要為大家詳細(xì)介紹了C++STL容器之string類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

前言

為什么學(xué)習(xí)string類:

在C語(yǔ)言中,字符串是以'\0'結(jié)尾的集合,為了操作方便,在C標(biāo)準(zhǔn)庫(kù)中提供一些str系列的函數(shù)(strstr,strcmp,strcpy……),但是這些庫(kù)函數(shù)和字符串時(shí)分離的,不太符合oop的思想。稍不留神就會(huì)造成越界訪問(wèn)。

在OJ題中,有關(guān)字符串的題目基本以string的形式出現(xiàn),而且在常規(guī)的工作中,為了簡(jiǎn)單,方便,快捷,基本都是使用string類,很少有人會(huì)使用C庫(kù)中的字符串操作函數(shù)。

1.標(biāo)準(zhǔn)庫(kù)中的string類

1.string類是表示字符串的字符種類。

2.該類的接口與常規(guī)容器的接口基本相同,在添加一些專門(mén)用來(lái)操作string的常規(guī)操作。

3.string的底層是:basic_string模板類的別名。

4.不能操作多字節(jié)或者變長(zhǎng)字符的序列。

在使用string的時(shí)候,必需包含頭文件#include<string>以及using namespace std;

2.string類的常用接口說(shuō)明

2.1 string對(duì)象的常見(jiàn)構(gòu)造

string() 構(gòu)造空的string類對(duì)象
string(const char* str)以常量字符創(chuàng)為參數(shù)構(gòu)造string類
string(size_t n,char ch)string對(duì)象中包含了n個(gè)字符c
string(const string& s)

拷貝構(gòu)造函數(shù)

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1;
	string s2("CSDN");
	string s3(4, 'A');
	string s4(s2);
	cout << s1 << endl;
	cout << s2 << endl;
	cout << s3 << endl;
	cout << s4 << endl;
}
 
[點(diǎn)擊并拖拽以移動(dòng)]
?

 運(yùn)行結(jié)果:

2.2 string類對(duì)象的容量操作 

size返回字符串的有效長(zhǎng)度
length和size一致,推薦使用size
capacity返回總空間大小
clear清空有效字符,但是不對(duì)capacity有影響
reserve為字符串預(yù)留空間
empty判斷字符串是否為空串,返回值為bool
resize
將有效字符的個(gè)數(shù)該成n個(gè),多出的空間用字符c填充

 2.2.1 reserve是如何開(kāi)辟空間的

 void reserve (size_t n=0)

void TestPushBack()
{
	string s;
	size_t sz = s.capacity();
	for (int i = 0; i < 1000; ++i)
	{
		s.push_back('c');
		if (sz != s.capacity())//當(dāng)sz和_capacity不相等的時(shí)候,說(shuō)明reserve已經(jīng)增容了。
		{
			static int n = 1;
			sz = s.capacity();
			printf("第%d次開(kāi)辟空間:_capacity=%d\n", n++, sz);
		}
	}
}

運(yùn)行結(jié)果:

說(shuō)明在VS的環(huán)境下,reserve每次開(kāi)辟的空間是前一次空間的約1.5倍。

2.2.2 clear 和 empty

 void clear ()

bool empty() const

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1("CSDN");
	cout << s1.capacity() << endl;
	cout << s1.empty() << endl;
	s1.clear();	
	cout << s1.capacity() << endl;
	cout << s1.empty() << endl;
}

運(yùn)行結(jié)果:

說(shuō)明了clear只會(huì)清理有效的字符串,不會(huì)對(duì)空間的大小有影響,當(dāng)clear后,empty的返回值為0,說(shuō)明了此時(shí)的是s1是空字符串。

2.2.3 resize的用法

void resize(size_t n)

void resize(size_t n,char ch)

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1("CSDN");
	s1.resize(10, 'A');//輸出的是------>CSDNAAAAAAAA
	cout <<s1<< endl;
}

2.3 string類對(duì)象的訪問(wèn)以及遍歷操作 

operator[ ]
返回 pos 位置的字符, const string 類對(duì)象調(diào)用
begin+end
begin 獲取一個(gè)字符的迭代器 + end 獲取最后一個(gè)字符下一個(gè)位置的迭代器 (正向迭代器)
rbegin+rend
begin 獲取一個(gè)字符的迭代器 + end 獲取最后一個(gè)字符下一個(gè)位置的迭代器 (反向迭代器)
范圍forC++11支持的更簡(jiǎn)潔的遍歷方式

const_iterator begin()const

iterator begin()

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1("hello CSDN");
	auto it1= s1.begin();//正向迭代器
	while (it1 != s1.end())//end指向的是最后一個(gè)元素的下一位
	{
		cout << *it1 << " ";
		it1++;
	}
	cout << endl;
	auto it2 = s1.rbegin();//反向迭代器
	while (it2 != s1.rend())
	{
		cout << *it2 << " ";
		it2++;
	}
}

運(yùn)行結(jié)果:

范圍for的使用

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1("hello CSDN");
	for (auto ch :s1)
		cout << ch<< " ";
}

本質(zhì)上,范圍for調(diào)用的是迭代器。

2.4 string類對(duì)象的修改操作 

push_back尾插字符ch
append尾插字符串str
operator+=尾插字符ch/尾插字符串
c_str返回C格式字符串
find+npos
從字符串pos位置開(kāi)始往后找字符c,返回該字符在字符串中的位置,npos是size_t的最大值
rfind
從字符串pos位置開(kāi)始往前找字符c,返回該字符在字符串中的位置
substr
在str中從pos位置開(kāi)始,截取n個(gè)字符,然后將其返回

2.4.1 push_back 和 append 以及operator+=

void push_back(char ch)

string& append(const char* str)

string& operator+=(char ch)

string& operator+=(const char* str)

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1("hello ");
	s1.push_back('C');
	s1.append("SDN");
	cout << s1 << endl;
	string s2("hello ");
	s2 += 'w';
	s2 += "orld";
	cout << s2 << endl;
}

運(yùn)行結(jié)果:

operator +=可以尾插字符,也可以尾插字符串。實(shí)際上,operator +=尾插字符的時(shí)候,調(diào)用的是push_back,尾插字符串的時(shí)候,調(diào)用的是append。

2.4.2  find 和 rfind 以及 substr

size_t find(char c,size_t pos=0) const

size_t rfind(char c,size_t pos=npos)

string substr(size_t pos=0,size_t len=npos)

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1("hello CSDN");
	cout << s1.find('C') << endl;
	cout << s1.rfind('C',0) << endl;//從pos=0處,即字符'h'往前找,找不到字符'C'返回的是npos
	                                //npos是size_t中的最大值--->4294967295
	cout << s1.rfind('C', 8) << endl;
	cout << s1.substr(2, 3) << endl;//從字符串的第二個(gè)位置開(kāi)始,截取len=3個(gè)字符
}

運(yùn)行結(jié)果:

2.5 string非成員函數(shù)重載

operator+盡量少用,因?yàn)閭髦捣祷?,?dǎo)致深拷貝效率低
operator<<輸出運(yùn)算符重載
operator>>輸出運(yùn)算符重載
getline獲取一行字符串
relational operator大小比較

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!   

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)BMP圖像的讀寫(xiě)功能

    C語(yǔ)言實(shí)現(xiàn)BMP圖像的讀寫(xiě)功能

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)BMP圖像的讀寫(xiě)功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • C++ 二維數(shù)組參數(shù)傳遞的實(shí)現(xiàn)方法

    C++ 二維數(shù)組參數(shù)傳遞的實(shí)現(xiàn)方法

    這篇文章主要介紹了C++ 二維數(shù)組參數(shù)傳遞的實(shí)現(xiàn)方法的相關(guān)資料,這里提供三種方法幫助大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-08-08
  • c++實(shí)現(xiàn)合并文件以及拆分實(shí)例代碼

    c++實(shí)現(xiàn)合并文件以及拆分實(shí)例代碼

    這篇文章主要介紹了c++實(shí)現(xiàn)合并文件以及拆分實(shí)例代碼,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • C語(yǔ)言 main 函數(shù)詳情

    C語(yǔ)言 main 函數(shù)詳情

    這篇文章主要介紹C語(yǔ)言 main 函數(shù),文章將圍繞C語(yǔ)言 main 函數(shù)相關(guān)資料詳細(xì)展開(kāi),需要的朋友可以參考一下
    2021-10-10
  • C++常用字符串分割方法實(shí)例匯總

    C++常用字符串分割方法實(shí)例匯總

    這篇文章主要介紹了C++常用字符串分割方法實(shí)例匯總,包括了strtok函數(shù)、STL、Boost等常用的各類字符串分割方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-10-10
  • 使用mmap實(shí)現(xiàn)多進(jìn)程對(duì)大文件拷貝

    使用mmap實(shí)現(xiàn)多進(jìn)程對(duì)大文件拷貝

    這篇文章主要介紹了使用mmap實(shí)現(xiàn)多進(jìn)程對(duì)大文件拷貝,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • C語(yǔ)言中關(guān)于scanf讀取緩存區(qū)的問(wèn)題

    C語(yǔ)言中關(guān)于scanf讀取緩存區(qū)的問(wèn)題

    scanf()函數(shù)是通用終端格式化輸入函數(shù),它從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤(pán)) 讀取輸入的信息,接下來(lái)通過(guò)本文給大家介紹C語(yǔ)言中關(guān)于scanf讀取緩存區(qū)的問(wèn)題,需要的朋友一起看看吧
    2021-09-09
  • 利用C++實(shí)現(xiàn)一個(gè)線程安全的map

    利用C++實(shí)現(xiàn)一個(gè)線程安全的map

    這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)一個(gè)線程安全的map(使用ChatCPT生成),代碼是通過(guò)兩輪對(duì)話完善的,感興趣的小伙伴可以了解一下
    2023-05-05
  • c語(yǔ)言 字符串的拼接和分割實(shí)例

    c語(yǔ)言 字符串的拼接和分割實(shí)例

    今天小編就為大家分享一篇c語(yǔ)言 字符串的拼接和分割實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • 淺談C++11的std::function源碼解析

    淺談C++11的std::function源碼解析

    類模版std::function是一種通用的多態(tài)函數(shù)包裝器std::function的實(shí)例可以對(duì)任何可以調(diào)用的目標(biāo)實(shí)體進(jìn)行存儲(chǔ)、復(fù)制、和調(diào)用操作,本文詳細(xì)的介紹一下,感興趣的可以了解一下
    2021-06-06

最新評(píng)論

安徽省| 安图县| 韩城市| 巴塘县| 镇安县| 常熟市| 五指山市| 定州市| 台北县| 密云县| 涟源市| 蒙山县| 大安市| 蒲江县| 观塘区| 肇源县| 高尔夫| 泉州市| 磐石市| 周至县| 蓝山县| 东乡| 石柱| 福鼎市| 屏东县| 泰安市| 合阳县| 石棉县| 娱乐| 揭东县| 库车县| 崇仁县| 铜川市| 章丘市| 滦平县| 抚松县| 陇南市| 沁水县| 盖州市| 长汀县| 金堂县|