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

【C++】string類的深入介紹

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

【C++】string類的深入介紹(1)

作者:愛寫代碼的剛子
時間:2023.5.26
本篇博客主要深入介紹string類、string類的常用接口及操作,string中迭代器的使用,以及string中的部分方法。(由于篇幅有限,剩余方法以及string的深淺拷貝將在之后的博客介紹)
前言:C語言中,字符串是以’\0’結(jié)尾的一些字符的集合,為了操作方便,C標(biāo)準(zhǔn)庫中提供了一些str系列的庫函數(shù),但是這些庫函數(shù)與字符串是分離開的,不太符合OOP的思想,而且底層空間需要用戶自己管理,稍不留神可能還會越界訪問。

C++參考網(wǎng)站:

C++參考
C++官網(wǎng)
如果方便地查找網(wǎng)頁中的關(guān)鍵字可以使用ctrl + f進行搜索
以C++參考網(wǎng)站為例,演示查找string類:
【C++】string類的深入介紹

標(biāo)準(zhǔn)庫中的string類

string類(了解即可)
  1. 字符串是表示字符序列的類
  2. 標(biāo)準(zhǔn)的字符串類提供了對此類對象的支持,其接口類似于標(biāo)準(zhǔn)字符容器的接口,但添加了專門用于操作
    單字節(jié)字符字符串的設(shè)計特性。
  3. string類是使用char(即作為它的字符類型,使用它的默認char_traits和分配器類型(關(guān)于模板的更多信
    息,請參閱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類的常用接口說明(最常用的)

學(xué)會查文檔對C++的學(xué)習(xí)是非常重要的?。ㄒ韵率褂脜⒖季W(wǎng)站為例):
【C++】string類的深入介紹
這里只列舉的部分,大家學(xué)習(xí)的時候一定要學(xué)會查文檔!

  • string類對象的常見構(gòu)造
(constructor)函數(shù)名稱 功能說明
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ù)
  • string類對象的容量操作
函數(shù)名稱 功能說明
size(重點) 返回字符串有效字符長度
length 返回字符串有效字符長度
capacity 返回空間總大小
empty(重點) 檢測字符串釋放為空串,是返回true,否則返回false
clear(重點) 清空有效字符
reserve(重點) 為字符串預(yù)留空間
resize(重點) 將有效字符的個數(shù)改成n個,多出的空間用字符c填充

注意:

  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)萘看笮 ?/mark>
  • string類對象的訪問及遍歷操作
函數(shù)名稱 功能說明
operator(重點) 返回pos位置的字符,const string類對象調(diào)用
begin + end begin獲取一個字符的迭代器 + end獲取最后一個字符下一個位置的迭代器
rbegin + rend rbegin返回一個逆向迭代器,指向字符串的最后一個字符+rend返回一個逆向迭代器,指向字符串的開頭(第一個字符的前一個位置)。
范圍for C++11支持更簡潔的范圍for的新遍歷方式
  • string類對象的修改操作
函數(shù)名稱 功能說明
push_back 在字符串后尾插字符c
append 在字符串后追加一個字符串
operator+=(重點) 在字符串后追加字符串str
c_str(重點) 返回C格式字符串
find + npos(重點) 從字符串pos位置開始往后找字符c,返回該字符在字符串中的位置
rfind 從字符串pos位置開始往前找字符c,返回該字符在字符串中的位置
substr 在str中從pos位置開始,截取n個字符,然后將其返回

注意:

  1. 在string尾部追加字符時,s.push_back? / s.append(1, c) / s += 'c’三種的實現(xiàn)方式差不多,一般情況下string類的+=操作用的比較多,+=操作不僅可以連接單個字符,還可以連接字符串。
  2. 對string操作時,如果能夠大概預(yù)估到放多少字符,可以先通過reserve把空間預(yù)留好。
  • string類非成員函數(shù)
函數(shù) 功能說明
operator+ 盡量少用,因為傳值返回,導(dǎo)致深拷貝效率低
operator>>(重點) 輸入運算符重載
operator<<(重點) 輸出運算符重載
getline(重點) 獲取一行字符串
relational operators(重點) 大小比較

【C++】string類的深入介紹

  • 需要注意的一個小點:
    在對string類使用<<的運算符重載進行比較時,我們一定要注意==<<的優(yōu)先級較高(相較于普通的運算符)==,所有我們進行比較時要帶上括號!
    【C++】string類的深入介紹

  • 正確使用:
    【C++】string類的深入介紹

    • npos靜態(tài)變量的介紹:

【C++】string類的深入介紹
npos不是-1,而是整形的最大值(因為npos是無符號整型)
【C++】string類的深入介紹

  • 其他一些重要的修飾符和字符串操作:
    【C++】string類的深入介紹
    append(追加字符串)以及push_back(尾插一個字符)等一些函數(shù)已經(jīng)實現(xiàn)了自動擴容(C++的好處,本質(zhì)是字符管理的順序表),但是建議使用 += ,因為 += 重載了這兩種方法(例:string str;str += ('0' + val);(直接將整型val轉(zhuǎn)成字符串))
    注意有些情況+=不能替代append
    下面是append具體信息:
    【C++】string類的深入介紹

具體用法查文檔即可

詳細介紹string::operator[]

示例:
【C++】string類的深入介紹

上述代碼中str和a雖然都是字符串,但是str的實現(xiàn)邏輯是調(diào)用string::operator,而a的實現(xiàn)邏輯是*(a+1);(在clion編譯器中編譯器跳過了第9行的a[1];語句,沒有執(zhí)行(編譯器的優(yōu)化))

迭代器

string中的迭代器(任何容器都支持,用法都是類似的)

示例:
【C++】string類的深入介紹

  • iterator是像指針一樣的類型,有可能是指針,有可能不是指針(封裝的指針)。(其實iterator的底層是用指針來實現(xiàn)的)
  • 范圍for(底層替換為迭代器,可以查看反匯編代碼,一個類支持迭代器就支持范圍for)
    【C++】string類的深入介紹

以上代碼中若要進行對str2的修改可以使用引用:
【C++】string類的深入介紹

  • 鏈表中使用迭代器
    【C++】string類的深入介紹
    iterator提供了一種統(tǒng)一的方式,訪問和修改容器的數(shù)據(jù)。算法通過迭代器去處理容器中的數(shù)據(jù)
  • 迭代器可以和容器進行配合
    以reverse函數(shù)舉例:
    【C++】string類的深入介紹
    由于reverse提供了list模版,所以可以對鏈表實現(xiàn)逆置。
    當(dāng)然,也可以使用范圍for來替代迭代器:
    【C++】string類的深入介紹
string中的反向迭代器

【C++】string類的深入介紹
而范圍for不能反向遍歷

begin()、end()以及rbegin()、rend()具體指向的位置

如下圖所示
【C++】string類的深入介紹

const迭代器

注意auto在自動識別類型時并不帶上常量屬性
【C++】string類的深入介紹

  • 如果我們想要使迭代器帶上常量屬性需要加上const_
    【C++】string類的深入介紹
    此時使用迭代器時不能改變存儲在容器中的數(shù)據(jù)。
    附:其他迭代器補充:
    【C++】string類的深入介紹
    可以去作者提供的C++參考網(wǎng)站上去查詢函數(shù)的具體用法(建議多查找網(wǎng)站)

string中的Capacity

【C++】string類的深入介紹

  • string類中有兩種表示字符串長度的方法(size()和length()),這里只推薦使用size(),因為有些STL不支持length()(比如map)
max_size

max_size在不同的編譯器上的結(jié)果不同。(所以使用時需謹(jǐn)慎,因為STL只是規(guī)范,它有許多不同的版本(大同小異),導(dǎo)致結(jié)果不同)
演示:
clion下:
【C++】string類的深入介紹

  • Linux下:
    【C++】string類的深入介紹
capacity

同max_size,在不同的編譯器下的結(jié)果并不相同!
clion下:
【C++】string類的深入介紹
Linux下:
【C++】string類的深入介紹
同時不同的編譯器的擴容機制也不相同
演示:
clion下:
【C++】string類的深入介紹

Linux下:
【C++】string類的深入介紹

clear(清理空間但并不釋放空間

clion下:
【C++】string類的深入介紹
Linux下:
【C++】string類的深入介紹
所以clear()并不會釋放空間

reserve(提前給string開空間)

【C++】string類的深入介紹
clion下:
clion即使清理了數(shù)據(jù),也不會進行縮容
【C++】string類的深入介紹

Linux下:
如果清理了數(shù)據(jù)使用reserve就會進行縮容,縮為0
【C++】string類的深入介紹
如果沒有清理數(shù)據(jù)也進行縮容,縮小到size大小
【C++】string類的深入介紹

不同的編譯器reserve的效果不同,同時還與clear函數(shù)有關(guān),clion下沒實現(xiàn)縮容,而Linux的g++編譯器下會實現(xiàn)縮容(使用clear清理數(shù)據(jù)后會縮到0,如果沒有清理數(shù)據(jù)則會縮小到size大?。?。

resize 不單單擴容,而是開空間加初始化(不給初始化值默認/0)

【C++】string類的深入介紹
resize如果給的值比原來string的size小,并不會縮容,capacity不會改變,空間沒銷毀,但是字符串的長度改變了 因為縮容是有代價的,所以resize不會改變空間,以免之后還要開空間文章來源地址http://www.zghlxwxcb.cn/news/detail-481464.html

  • 如果想要實現(xiàn)縮容可以用shrink_to_fit函數(shù)(具體用法查網(wǎng)站即可),但不建議縮容。

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

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

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【c++】string類的使用

    【c++】string類的使用

    目錄 一、標(biāo)準(zhǔn)庫中的string類 1、簡單介紹string類 2、string類的常用接口注意事項 2.1、string類對象的常用構(gòu)造 2.2、string類對象的容量操作 2.3、string類對象的訪問及遍歷操作 2.4、string類對象的修改操作 二、string類的模擬實現(xiàn) ? ? ? ? (1)string是表示字符串的字符串類; ? ?

    2024年02月01日
    瀏覽(23)
  • 【C++】String類的模擬實現(xiàn)。

    ??博客主頁:小智_x0___0x_ ??歡迎關(guān)注:??點贊??收藏??留言 ??系列專欄:C++初階 ??代碼倉庫:小智的代碼倉庫 string類中需要三個成員變量分別記錄元素個數(shù)、容量和內(nèi)容。還需要一個 size_t 類型npos-1表示整型的最大值。 這段代碼是 string 類的構(gòu)造函數(shù)。構(gòu)造函數(shù)是在

    2024年02月13日
    瀏覽(20)
  • C++ String類的基本使用

    C++ String類的基本使用

    ????????放棄時間的人,時間也會放棄他?!勘葋?; 本篇章是關(guān)于string類內(nèi)一些函數(shù)的介紹以及使用方法,都是我們編程必須掌握的基礎(chǔ)! ? 全文共7000字左右. 話不多說安全帶系好,發(fā)車?yán)?(建議電腦觀看) 。 附:紅色,部分為重點部分;藍顏色為需要記憶的

    2024年02月09日
    瀏覽(28)
  • 【C++】string類的基礎(chǔ)操作

    【C++】string類的基礎(chǔ)操作

    ??個人主頁?? ?個人專欄——C++學(xué)習(xí)? ??點擊關(guān)注??一起學(xué)習(xí)C語言???? 目錄 導(dǎo)讀 1. 基本概述 2.?string類對象的常見構(gòu)造 3.?string類對象的容量操作 4. string類對象的訪問及遍歷操作 5. 迭代器 6. string類對象的修改操作 6.1 基本修改操作 6.2 c_str()函數(shù) 6.3 find + npos、rfind和

    2024年03月11日
    瀏覽(26)
  • 【C++】string類的模擬實現(xiàn)

    【C++】string類的模擬實現(xiàn)

    前言:在上一篇中我們講到了string類的使用方法,今天我們將進一步的去學(xué)習(xí)string類,去底層看看它順帶模擬實現(xiàn)部分的內(nèi)容。 ?? 博主CSDN主頁:衛(wèi)衛(wèi)衛(wèi)的個人主頁 ?? ?? 專欄分類:高質(zhì)量C++學(xué)習(xí) ?? ??代碼倉庫:衛(wèi)衛(wèi)周大胖的學(xué)習(xí)日記?? ??關(guān)注博主和博主一起學(xué)習(xí)!一起努

    2024年03月21日
    瀏覽(22)
  • String類的學(xué)習(xí)筆記(上):介紹String類及其常用方法的使用

    String類的學(xué)習(xí)筆記(上):介紹String類及其常用方法的使用

    本文介紹了Java中用來描述操作字符串的String類,和其一些常用的基本操作方法,字符串的創(chuàng)建輸出,字符串對象的比較,字符串查找,字符串的轉(zhuǎn)化,字符串的替換,字符串拆分,字符串截取,和大小寫轉(zhuǎn)換,去除左右空格,子字符串包含,學(xué)會使用這些方法,能更方便的使用操作字符串~ 前言

    2023年04月23日
    瀏覽(35)
  • C++中string類的常用函數(shù)

    C++中string類的常用函數(shù)

    引言:在C語言中對于字符串的一些操作,例如在字符串末尾增加字符,對字符串拷貝等,我們可以通過調(diào)用庫中函數(shù)來完成這些操作,在C++中,我們把這些常規(guī)操作封裝成了string類,可以通過類對象直接調(diào)用這些函數(shù),使得更加符合了面向?qū)ο蟮乃枷搿?作用:返回字符串的有效字符長度

    2024年02月08日
    瀏覽(25)
  • 【C++】string類的深淺拷貝問題

    【C++】string類的深淺拷貝問題

    我們知道,定義一個類的時候,如果我們沒有寫構(gòu)造,拷貝構(gòu)造,賦值運算符重載,析構(gòu)方法的話,編譯器會自動生成。當(dāng)該類成員中涉及到資源的管理時,實現(xiàn)的就是淺拷貝。所以,以上這幾種方式是必須要程序猿手動實現(xiàn)的。 舉例來看: 圖中所示:實現(xiàn)了構(gòu)造和析構(gòu),

    2023年04月26日
    瀏覽(23)
  • C++ 之 string類的模擬實現(xiàn)

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

    這學(xué)習(xí)我有三不學(xué) 昨天不學(xué),因為昨天是個過去 明天不學(xué),因為明天還是個未知數(shù) 今天不學(xué),因為我們要活在當(dāng)下,我就是玩嘿嘿~ –?–?–?–?–?–?–?–?–?–?–?–?–?–?–?–?–?–?–?-正文開始-?–?–?–?–?–?–?–?–?–?–

    2024年04月27日
    瀏覽(21)
  • 【C++初階】9. string類的模擬實現(xiàn)

    【C++初階】9. string類的模擬實現(xiàn)

    string類的完整實現(xiàn)放這里啦!快來看看吧 string類的作用就是將字符串類型實現(xiàn)更多功能,運算符重載,增刪改查等等操作,所以其成員就包含char*的字符串 在之前的學(xué)習(xí)過程中,我們了解到類中存在的六個默認函數(shù),其中就包含默認構(gòu)造函數(shù),那么對于string類是否需要用戶自

    2024年02月09日
    瀏覽(20)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包