国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++ STL string類

這篇具有很好參考價值的文章主要介紹了C++ STL string類。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

一.為什么學習string類

(1) C語言中的字符串

(2)標準庫里面的string類

二. string類的常用接口說明

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

(2)string類對象的容量操作

1.size(),length().

2. capacity()

3.empty()

?4.clear()

?5.reserve()

?6.resize()

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

?1.operator[ pos ] ,at(size_t pos)

?2.back(),front()

(4)string類的迭代器

1.begin(),end()

2.rbegin() ,rend()

3.范圍for

(5) string類對象的修改操作

1.push_bank( )

?2.append()

3.operator +=

?4.insert ()

?5.erase()

6.swap()

(6)字符串相關算法

1.c_str()

?2.find()

3.substr()

(7) 非成員函數(shù)重載

1.getline()


一.為什么學習string類

(1) C語言中的字符串

C語言中,字符串是以'\0'結(jié)尾的一些字符的集合,為了操作方便,C標準庫中提供了一些str系列的庫函數(shù),但是這些庫函數(shù)與字符串是分離開的,不太符合OOP的思想,而且底層空間需要用戶自己管理,稍不留神可能還會越界訪問。

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

(2)標準庫里面的string類

string類文檔

  1. 字符串是表示字符序列的類
  2. 標準的字符串類提供了對此類對象的支持,其接口類似于標準字符容器的接口,但添加了專門用于操作單字節(jié)字符字符串的設計特性。
  3. string類是使用char(即作為它的字符類型,使用它的默認char_traits和分配器類型(關于模板的更多信息,請參閱basic_string)。
  4. string類是basic_string模板類的一個實例,它使用char來實例化basic_string模板類,并用char_traits和allocator作為basic_string的默認參數(shù)(根于更多的模板信息請參考basic_string)。
  5. 注意,這個類獨立于所使用的編碼來處理字節(jié):如果用來處理多字節(jié)或變長字符(如UTF-8)的序列,這個類的所有成員(如長度或大小)以及它的迭代器,將仍然按照字節(jié)(而不是實際編碼的字符)來操作。

總結(jié):
1. string是表示字符串的字符串類
2. 該類的接口與常規(guī)容器的接口基本相同,再添加了一些專門用來操作string的常規(guī)操作。
3. string在底層實際是:basic_string模板類的別名,typedef basic_string<char, char_traits, allocator>string;
4. 不能操作多字節(jié)或者變長字符的序列

在使用string類時,必須包含#include頭文件以及using namespace std;

二. string類的常用接口說明

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

C++ STL string類,C++,c++,開發(fā)語言

string() (重點) 創(chuàng)建空的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ù)
#include<iostream>
#include<string>
using namespace std;
int main()
{
	//創(chuàng)建空字符串
	string str1;
	cout << str1 << endl;
	//使用字符串構(gòu)造對象
	string str2("hello world");
	cout << str2 << endl;
	//使用n個字符構(gòu)造對象
	string str3(15, '*');
	cout << str3 << endl;
	//拷貝構(gòu)造函數(shù)
	string str4(str2);
	cout << str4 << endl;

	return 0;
}

C++ STL string類,C++,c++,開發(fā)語言

(2)string類對象的容量操作

課件代碼/C++課件V6/string的接口測試及使用/TestString.cpp · will/C++上課 - Gitee.com

1.size(),length().

size()和lenth都是返回字符串有效長度的。

注意:我們一般表示字符串的長度時使用length,引入size()的原因是為了與其他容器的接口保持一致,一般情況下基本都是用size()。

int main()
{
	string str("hello world");
	cout << str.size() << endl;
	cout << str.length() << endl;

	return 0;
}

C++ STL string類,C++,c++,開發(fā)語言

2. capacity()

capacity()是返回字符串對象的總空間大小的,因為string自己本身是可以擴容的。

int main()
{
	string str("hello world");
	cout << str.size() << endl;
	cout << str.length() << endl;
	cout << str.capacity() << endl;

	return 0;
}

C++ STL string類,C++,c++,開發(fā)語言

3.empty()

檢測字符串釋放為空串,是返回true,否則返回false。

int main()
{
	string str("hello world");
	string str1;
	cout << str.empty() << endl;
	cout << str1.empty() << endl;

	return 0;
}

C++ STL string類,C++,c++,開發(fā)語言

?4.clear()

清楚有效字符。

注意:clear()只是將string中有效字符清空,不改變底層空間大小。

int main()
{
	string str("hello world hello world hello ");
	cout << "clear前:" << str <<" 容量:" << str.capacity() << endl;
	str.clear();
	cout << "clear前:" << str << "容量:" << str.capacity() << endl;
	return 0;
}

C++ STL string類,C++,c++,開發(fā)語言

?5.reserve()

為字符串預留空間,我們直到在一些情況下如果我們提前知道了字符串的大小,就可以提前為字符串開好空間,避免后面的擴容帶來的效率上的消耗。

注意:實際上的申請后的空間會比我們申請的空間大一些,這也是一種保護機制。但是我們?nèi)绻覀冾A留的空間比原本的空間還要小時,此時函數(shù)會進行優(yōu)化,個根據(jù)我們存儲的串的長度經(jīng)行合適的改表。

C++ STL string類,C++,c++,開發(fā)語言

?6.resize()

C++ STL string類,C++,c++,開發(fā)語言

resize(size_t n)resize(size_t n, char c)都是將字符串中有效字符個數(shù)改變到n個,不同的是當字符個數(shù)增多時:resize(n)用0來填充多出的元素空間,resize(size_t n, char c)用字符c來填充多出的元素空間。注意:resize在改變元素個數(shù)時,如果是將元素個數(shù)增多,可能會改變底層容量的大小,如果是將元素個數(shù)減少,底層空間總大小不變。如果 n 小于字符串長度,就刪去字符串保留前 n 個。

int main()
{
	string str("abcde");
	cout << str << endl;
	//擴容+初始化
	str.resize(str.size() + 5, '#');
	cout << str << endl;
	//減小長度
	str.resize(4);
	cout << str << endl;

	return 0;
}

C++ STL string類,C++,c++,開發(fā)語言

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

?1.operator[ pos ] ,at(size_t pos)

C++ STL string類,C++,c++,開發(fā)語言

C++ STL string類,C++,c++,開發(fā)語言

operator [ ] 都是返回pos位置的字符,const string類對象調(diào)用。operater[ ]是對[ ]的運算符重載,就像數(shù)組一樣的訪問。

注意:兩者的區(qū)別在,處理越界方面,operator[ ]使用斷言處理,而 at(pos) 是拋出一個異常。

int main()
{
	string str("hello");
	for (int i = 0; i < str.size(); i++)
	{
		cout << str[i] << " ";
	}
	cout << endl;
	for (int i = 0; i < str.size(); i++)
	{
		cout << str.at(i) << " ";
	}
	return 0;
}

C++ STL string類,C++,c++,開發(fā)語言

?2.back(),front()

back():返回最后一字符,front():返回第一個字符。

(4)string類的迭代器

1.begin(),end()

C++ STL string類,C++,c++,開發(fā)語言

C++ STL string類,C++,c++,開發(fā)語言

begin():返回一個迭代器,該迭代器指向字符串的開始字符。

end():返回一個迭代器,該迭代器指向字符串的結(jié)束字符。

迭代器,也是一個用來遍歷對象的一個東西,它有自己的類型 iterator ,針對begin(),和end(),也都有自己的const版本,也就是僅可讀迭代器。string的迭代器的使用和指針差不多。

當前可以這么理解,隨著我們STL的不斷學習,會對迭代器有更加深刻的理解。

int main()
{
	string str("helloworld");
	//非const迭代器,可讀,可寫
	for (string::iterator it = str.begin();it!=str.end();it++)
	{
		*it = '*';
	}
	for (string::iterator it = str.begin(); it != str.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
	//const 迭代器 僅可讀
	const string str1("helloworld");
	for (string::const_iterator it = str1.begin(); it != str1.end(); it++)
	{
		cout << *it << " ";
	}
	return 0;
}

C++ STL string類,C++,c++,開發(fā)語言

2.rbegin() ,rend()

C++ STL string類,C++,c++,開發(fā)語言

C++ STL string類,C++,c++,開發(fā)語言

rbegin():返回反向迭代器以反向開始,返回一個反向迭代器,指向字符串的最后一個字符(即其反向開頭),反向迭代器向后迭代:增加迭代器會將它們移向字符串的開頭。

rend():返回一個反向迭代器,該迭代器指向字符串的第一個字符之前的理論元素(被視為其反向結(jié)尾)。

反向迭代器的類型是,reverse_iterator,同時都提供了,const版本。

int main()
{
	string str("helloworld");
	
	for (string::reverse_iterator it = str.rbegin(); it != str.rend(); it++)
	{
		cout << *it << " ";
	}
	return 0;
}

?C++ STL string類,C++,c++,開發(fā)語言

對于迭代器的類型寫起來非常的不方便,我們可以使用auto來自動識別。

3.范圍for

范圍for是將str對象的字符一個一個取出來,放到 c 中。其底層還是使用的迭代器。

int main()
{
	string str("helloworld");

	for (auto c : str)
	{
		cout << c << " ";
	}
	return 0;
}

C++ STL string類,C++,c++,開發(fā)語言

(5) string類對象的修改操作

1.push_bank( )

C++ STL string類,C++,c++,開發(fā)語言

在字符串后尾插字符c。

int main()
{
	string str("hello");
	cout << str << endl;
	str.push_back('w');
	str.push_back('o');
	str.push_back('r');
	str.push_back('l');
	str.push_back('d');
	cout << str<<endl;
	return 0;
}

C++ STL string類,C++,c++,開發(fā)語言

?2.append()

C++ STL string類,C++,c++,開發(fā)語言

在字符串后追加一個字符串,同時也提供了多個版本:

string& append (const string& str):追加一個字符串 str 。

string& append (const string& str, size_t subpos, size_t sublen):追加字符串str的pos位置后的sublen個字符。

string& append (const char* s):追加一個C字符串,(即以‘/0’結(jié)束的字符串)。

string& append (const char* s, size_t n):追加C字符串s的后n個字符。

string& append (size_t n, char c):追加 n 個字符 c  

int main()
{
	string str;
	string str1;
	cout << str << endl;
	string str2 = "Writing ";
	//str1追加str2的第四個位置的后三個字符
	str1.append(str2, 4,3);
	//str追加str2
	str.append(str2);
	cout << str << endl;
	cout << str1 << endl;
	//str2z追加一個C字符串
	str2.append("work");
	cout << str2 << endl;
	//str2追加一個c字符串的前兩個字符
	str2.append("hello", 2);
	cout << str2 << endl;
	//str2追加10個‘#’
	str2.append(10, '#');
	cout << str2 << endl;

	return 0;
}

C++ STL string類,C++,c++,開發(fā)語言

3.operator +=

C++ STL string類,C++,c++,開發(fā)語言

?對于上述的push_bank和append其實在string類中使用并不多,我們一般常用operator+=來追加字符串或者追加字符。

例:

int main()
{
	string str1("hello");
	string str2("world");
	str1 += str2;
	
	cout << str1 << endl;

	return 0;
}

C++ STL string類,C++,c++,開發(fā)語言

?4.insert ()

字符串插入函數(shù),可以支持在某一位,或者迭代器位置插入固定個數(shù)的字符,和字符串。

C++ STL string類,C++,c++,開發(fā)語言

?例:

int main()
{
	string str1("hello");
	string str2("world");
	int pos = 0;
	//1.在pos位置插入一個 string 
	str2.insert(pos, str1);
	cout << str2 << endl;

	string str3("bcde");
	int size = 5;
	//2.在pos位置插入size個字符a
	str3.insert(pos, size, 'a');
	cout << str3 << endl;

	string str4("bcde");
	//3.插入位置還可以是迭代器
	str4.insert(str4.begin(), 10, 'A');
	cout << str4 << endl;

	string str5("world");
	const char* cstr = "hello ";
	//3.在pos位置插入一個 C風格字符串。
	str4.insert(pos,cstr);
	cout << str5 << endl;

	return 0;
}

C++ STL string類,C++,c++,開發(fā)語言

?注意:insert,在插入時,特別是在字符串的前部插入是,會有字符的移動消耗。相當于順序表的頭插。

?5.erase()

rases字符串的一部分,縮短其長度。

例:

int main()
{
	int pos = 5;
	int size = 3;
	string str1("hello   C++");
	string str2 = str1;
	cout << "erase前str1:" << str1 << endl;
	cout << "erase前str2:" << str2 << endl;
	//刪除pos位置包括pos位置的后size個字符,刪除位置也可以是一段迭代器區(qū)間
	str1.erase(pos, size);
	str2.erase(str2.begin()+5,str2.begin()+5+3);
	cout << "erase后str1:" << str1 << endl;
	cout << "erase后str2:" << str2 << endl;

	return 0;
}

C++ STL string類,C++,c++,開發(fā)語言

注意:

  • 如果給出的刪除個數(shù)大于字符串后面的字符數(shù),就會將后面字符全部刪除。
  • 如果不給出刪除位置設定的缺省參數(shù)從0開始刪除。
  • 如果不給出刪除個數(shù),缺省參數(shù)設定的刪除個數(shù)是 size_t npos = -1,約42億。
  • 刪除以后字符串的長度(length)會變,但是容量(capacity)不會變。

6.swap()

swap交換函數(shù),非功能上非常簡單,就不多介紹了。但是在 std 里面也有一個swap,我們兩個swap來對比一下。

std::swap()底層是一個由借助函數(shù)模板實現(xiàn)。不僅僅可以對string類型,對任何可以修改的類型都可以實現(xiàn)交換。

原理類似:


template<class T>
void Swap(T& e1,T& e2)
{
	T tmp = e1;
	e1 = e2;
	e2 = tmp;
}

string::swap()底層是交換string里面的字符串指針來實現(xiàn)的,總體效率要比std::swap()高得多。

(6)字符串相關算法

1.c_str()

返回一個C風格字符串。

?2.find()

C++ STL string類,C++,c++,開發(fā)語言

在字符串中搜索由其參數(shù)指定的序列的第一個匹配項。
指定pos時,搜索僅包括位置pos處或之后的字符,忽略任何可能出現(xiàn)的位置pos之前的字符。

?例如:

int main()
{

	string str = "this is a string";
    //從1位置開始查找字符a,并返回位置。
	size_t pos = str.find('a', 1);
	cout << "a 在" << pos << "位置" << endl;

    return 0;
}

C++ STL string類,C++,c++,開發(fā)語言

?注意:

  • 如果未給出查找位置,就從缺省位置0開始查找。
  • 如果沒有找到會返回size_t npos = -1。

3.substr()

C++ STL string類,C++,c++,開發(fā)語言

返回一個新構(gòu)造的字符串對象,該對象的值初始化為此對象的子字符串的副本。
子字符串是對象的一部分,從字符位置pos開始,跨越len個字符(或直到字符串結(jié)束,以先到者為準)。

例:

int main()
{

	int pos = 0;
	int length = 4;
	string str = "this is a string";
	//返回一個從pos位置開始,跨越長度為4的子串。
	string Substr = str.substr(0, 4);

	cout << "Substr:" << Substr << endl;

    return 0;
}

C++ STL string類,C++,c++,開發(fā)語言

?注意:

如果沒給出起始位置,缺省參數(shù)設置為0。

如果沒給出跨越長度,缺省參數(shù)設置為size_t npos = -1。

(7) 非成員函數(shù)重載

1.getline()

C++ STL string類,C++,c++,開發(fā)語言

?從is中提取字符并將其存儲到str中,直到找到定界字符delim。沒有delim時默認是 ' \n '為定界符 。

?例:

int main()
{
	string str;
	cout << "輸入:";
	std::getline(cin, str,'a');
	cout << "str:" << str << endl;

	return 0;
}

C++ STL string類,C++,c++,開發(fā)語言文章來源地址http://www.zghlxwxcb.cn/news/detail-641975.html

到了這里,關于C++ STL string類的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【C++】STL之string類(2)

    【C++】STL之string類(2)

    個人主頁:平行線也會相交?? 歡迎 點贊?? 收藏? 留言? 加關注??本文由 平行線也會相交 原創(chuàng) 收錄于專欄【C++之路】?? 本專欄旨在記錄C++的學習路線,望對大家有所幫助??? 希望我們一起努力、成長,共同進步。?? reverse :在不改變字符串內(nèi)容的前提下,預留一定的

    2024年02月12日
    瀏覽(23)
  • C++ [STL之string的使用]

    C++ [STL之string的使用]

    本文已收錄至《C++語言》專欄! 作者:ARMCSKGT 字符串在程序中經(jīng)常出現(xiàn),C語言為此提供了很多字符串操作函數(shù),但是這些庫函數(shù)與字符串是分離開的,不太符合OOP的思想,而且底層空間需要用戶自己管理,稍不留神可能還會越界訪問,于是STL單獨為字符串實現(xiàn)了一個容器,

    2024年02月01日
    瀏覽(21)
  • 【C++】STL之string類(1)

    【C++】STL之string類(1)

    個人主頁:平行線也會相交?? 歡迎 點贊?? 收藏? 留言? 加關注??本文由 平行線也會相交 原創(chuàng) 收錄于專欄【C++之路】?? 本專欄旨在記錄C++的學習路線,望對大家有所幫助??? 希望我們一起努力、成長,共同進步。?? 接下來就開始STL部分的學習了,本文先來學習一下

    2024年02月11日
    瀏覽(24)
  • 【C++ ? STL】探究string的源碼

    【C++ ? STL】探究string的源碼

    ヾ(????)?\\\" 人總要為過去的懶惰而付出代價 ヾ(????)?\\\" 淺拷貝 :也稱位拷貝,編譯器只是將對象中的值拷貝過來。如果對象中管理資源,最后就會導致多個對象共享同一份資源,當一個對象銷毀時就會將該資源釋放掉,而此時另一些對象不知道該資源已經(jīng)被釋放,

    2024年02月08日
    瀏覽(16)
  • 【C++精華鋪】9.STL string

    【C++精華鋪】9.STL string

    目錄 1. string類的優(yōu)勢 2. string類的常用接口 2.1 常用構(gòu)造 1. 空串構(gòu)造:string(); 2. C串構(gòu)造:string(const char* s); 3. 拷貝構(gòu)造:string(const string str); 4. 字符填充構(gòu)造:string(size_t n, char c); 5. 迭代器構(gòu)造:string(InputIterator first, InputIterator last); 2.2 ?string容量操作 1. size_t size(),size_t length

    2024年02月11日
    瀏覽(16)
  • C++ STL string類模擬實現(xiàn)

    C++ STL string類模擬實現(xiàn)

    目錄 string類成員變量 一.構(gòu)造函數(shù) 二.析構(gòu)函數(shù) 三.拷貝構(gòu)造 四.size(),capacity() 五.operator [ ] 六. operator = ?七.字符串比較 ?八.reserve() 九.push_back(),append() 十.operator+= ?十一.insert() ?十二.迭代器 ?十二.erase() 十三.swap() ?十四.find() 十五.流提取,流輸出 十六

    2024年02月14日
    瀏覽(25)
  • 【C++】STL——string(兩萬字詳解)

    【C++】STL——string(兩萬字詳解)

    ??C++學習歷程:STL——string學習 博客主頁: 一起去看日落嗎 持續(xù)分享博主的C++學習歷程 博主的能力有限,出現(xiàn)錯誤希望大家不吝賜教 分享給大家一句我很喜歡的話: 也許你現(xiàn)在做的事情,暫時看不到成果,但不要忘記,樹??成長之前也要扎根,也要在漫長的時光??中沉

    2024年01月25日
    瀏覽(19)
  • 【C++入門到精通】C++入門 —— string類(STL)

    【C++入門到精通】C++入門 —— string類(STL)

    目錄 一、STL簡介? 1.STL是什么 2.STL的內(nèi)容 ?3.STL的使用前提 二、string類 1.string類 是什么 2.string類的特點和操做 ?構(gòu)造和初始化 ?字符串大小和容量 ?字符訪問和修改 ?字符串連接和拼接 ?子串操作 ?字符串比較 ?字符串修改 ?獲取字符的ASCII碼 ?字符串大小寫轉(zhuǎn)換:

    2024年02月14日
    瀏覽(43)
  • 【C++初階】8. STL初階 + String類

    【C++初階】8. STL初階 + String類

    STL(standard template libaray-標準模板庫):是C++標準庫的重要組成部分,不僅是一個可復用的組件庫,而且是一個包羅 數(shù)據(jù)結(jié)構(gòu)與算法的軟件框架 。 原始版本 Alexander Stepanov、Meng Lee 在 惠普實驗室 完成的原始版本,本著開源精神,他們聲明允許任何人任意運用、拷貝、修改、傳播

    2023年04月08日
    瀏覽(35)
  • c++學習:STL之string類初識

    c++學習:STL之string類初識

    目錄 1.關于STL 1.什么是STL 2.STL的六的組件 2.關于string類的學習 1.為何學習string類 2.何為string類 3.string類對象的構(gòu)造 4.容量操作 ?5.元素訪問的操作 6.迭代器(Iterators) 7.修改類的操作 ?8.字符串操作 STL(standard template library-標準模板庫):是c++標準庫的重要組成部分,不僅是一

    2024年02月03日
    瀏覽(87)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包