欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一起來看看C++STL容器之string類

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

前言

為什么學習string類:

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

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

1.標準庫中的string類

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

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

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

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

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

2.string類的常用接口說明

2.1 string對象的常見構造

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

拷貝構造函數(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;
}
 
[點擊并拖拽以移動]
?

 運行結果:

2.2 string類對象的容量操作 

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

 2.2.1 reserve是如何開辟空間的

 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())//當sz和_capacity不相等的時候,說明reserve已經增容了。
		{
			static int n = 1;
			sz = s.capacity();
			printf("第%d次開辟空間:_capacity=%d\n", n++, sz);
		}
	}
}

運行結果:

說明在VS的環(huán)境下,reserve每次開辟的空間是前一次空間的約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;
}

運行結果:

說明了clear只會清理有效的字符串,不會對空間的大小有影響,當clear后,empty的返回值為0,說明了此時的是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類對象的訪問以及遍歷操作 

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

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指向的是最后一個元素的下一位
	{
		cout << *it1 << " ";
		it1++;
	}
	cout << endl;
	auto it2 = s1.rbegin();//反向迭代器
	while (it2 != s1.rend())
	{
		cout << *it2 << " ";
		it2++;
	}
}

運行結果:

范圍for的使用

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

本質上,范圍for調用的是迭代器。

2.4 string類對象的修改操作 

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

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;
}

運行結果:

operator +=可以尾插字符,也可以尾插字符串。實際上,operator +=尾插字符的時候,調用的是push_back,尾插字符串的時候,調用的是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;//從字符串的第二個位置開始,截取len=3個字符
}

運行結果:

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

operator+盡量少用,因為傳值返回,導致深拷貝效率低
operator<<輸出運算符重載
operator>>輸出運算符重載
getline獲取一行字符串
relational operator大小比較

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!   

相關文章

  • C++?中的類型詳細

    C++?中的類型詳細

    這篇文章主要介紹了C++?中的類型,C++的類型很復雜,往往一個類型匹配錯誤就會導致程序報錯,本篇主要講解一些常用類型的概念以及細節(jié),需要的朋友可以參考一下,希望對你有所幫助
    2021-12-12
  • C語言實現(xiàn)順序表的順序查找和折半查找

    C語言實現(xiàn)順序表的順序查找和折半查找

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)順序表的順序查找和折半查找,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • C/C++深入講解內存管理

    C/C++深入講解內存管理

    本章主要介紹C語言與C++的內存管理,以C++的內存分布作為引入,介紹C++不同于C語言的內存管理方式(new?delete對比?malloc?free),感興趣的朋友來看看吧
    2022-05-05
  • memset函數(shù)的使用分析

    memset函數(shù)的使用分析

    本篇文章是對memset函數(shù)的使用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言中進制知識匯總

    C語言中進制知識匯總

    在C語言里,整數(shù)有三種表示形式:十進制,八進制,十六進制。 其中以數(shù)字0開頭,由0~7組成的數(shù)是八進制。以0X或0x開頭,由0~9,A~F或a~f 組成是十六進制。除表示正負的符號外,以1~9開頭,由0~9組成是十進制。
    2016-05-05
  • 利用Matlab繪制好看的旋轉九邊形

    利用Matlab繪制好看的旋轉九邊形

    這篇文章主要為大家介紹了如何利用Matlab繪制超好看的旋轉九邊形。文中的示例代碼講解詳細,對我們學習Matlab有一定幫助,需要的可以參考一下
    2022-03-03
  • C語言數(shù)據(jù)結構中定位函數(shù)Index的使用方法

    C語言數(shù)據(jù)結構中定位函數(shù)Index的使用方法

    這篇文章主要介紹了C語言數(shù)據(jù)結構中定位函數(shù)Index的使用方法的相關資料,希望通過本文能幫助到大家,讓大家理解這部分內容,需要的朋友可以參考下
    2017-10-10
  • 從C語言過渡到C++之基本變化

    從C語言過渡到C++之基本變化

    在之前的C++代碼訓練營系列中,我試圖用完成具體項目的方式給大家介紹C++,但后來大家反饋說這樣從C過渡到C++有點跟不上。于是我又專門設計了這個《從C到C++》的過渡專題,我準備通過10篇文章介紹一下C++和C的重要區(qū)別。
    2017-07-07
  • 詳解C++中遞增運算符重載的實現(xiàn)

    詳解C++中遞增運算符重載的實現(xiàn)

    本文主要詳解運算符重載里的遞增運算符重載;遞增和遞減原理是一樣的,這里就只分享遞增的重載;提到遞增遞減,我們都知道又前置和后置兩種方法, 那今天就詳解一下前置遞增和后置遞增的細節(jié),拿捏遞增運算符重載
    2022-06-06
  • C++音樂播放按鈕的封裝過程詳解

    C++音樂播放按鈕的封裝過程詳解

    此篇文章用于記錄學習C++封裝音樂播放按鈕,封裝將對象的屬性和行為作為一個整體,表現(xiàn)生活中的事物、將屬性和行為加以權限控制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08

最新評論