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

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

這篇具有很好參考價(jià)值的文章主要介紹了【C++初階】8. STL初階 + String類。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

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

STL初階

1. 什么是STL

STL(standard template libaray-標(biāo)準(zhǔn)模板庫):是C++標(biāo)準(zhǔn)庫的重要組成部分,不僅是一個(gè)可復(fù)用的組件庫,而且是一個(gè)包羅數(shù)據(jù)結(jié)構(gòu)與算法的軟件框架。

2. STL的版本

原始版本
Alexander Stepanov、Meng Lee 在惠普實(shí)驗(yàn)室完成的原始版本,本著開源精神,他們聲明允許任何人任意運(yùn)用、拷貝、修改、傳播、商業(yè)使用這些代碼,無需付費(fèi)。唯一的條件就是也需要向原始版本一樣做開源使 用。 HP版本–所有STL實(shí)現(xiàn)版本的始祖。
P. J. 版本
由P. J. Plauger開發(fā),繼承自HP版本,被Windows VisualC++采用,不能公開或修改,缺陷:可讀性比較低, 符號命名比較怪異。
RW版本
由Rouge Wage公司開發(fā),繼承自HP版本,被C+ +Builder 采用,不能公開或修改,可讀性一般。
SGI版本
由Silicon Graphics Computer Systems,Inc公司開發(fā),繼承自HP版 本。被GCC(Linux)采用,可移植性好, 可公開、修改甚至販賣,從命名風(fēng)格和編程風(fēng)格上看,閱讀性非常高。在學(xué)習(xí)STL的過程中,要閱讀部分源代碼, 主要參考的就是這個(gè)版本。

3. STL的六大組件

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

String類

1. 為什么學(xué)習(xí)string類?

1.1 C語言中的字符串

C語言中,字符串是以’\0’結(jié)尾的一些字符的集合,為了操作方便,C標(biāo)準(zhǔn)庫中提供了一些str系列的庫函數(shù),但是這些庫函數(shù)與字符串是分離開的,不太符合OOP的思想,而且底層空間需要用戶自己管理,稍不留神可能還會(huì)越界訪問。
【C++初階】8. STL初階 + String類
【C++初階】8. STL初階 + String類
但是ASCII碼值只適用于英文,對于中文漢字來說無法實(shí)現(xiàn),這時(shí)候就出現(xiàn)了Unicode編碼(萬國碼)
【C++初階】8. STL初階 + String類
【C++初階】8. STL初階 + String類
【C++初階】8. STL初階 + String類

2. 標(biāo)準(zhǔn)庫中的string類(string類的用法)

2.1 string類(了解)

string類的文檔介紹

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

總結(jié):

  1. string是表示字符串的字符串類
  2. 該類的接口與常規(guī)容器的接口基本相同,再添加了一些專門用來操作string的常規(guī)操作。
  3. string在底層實(shí)際是:basic_string模板類的別名,typedef basic_string <char, char_traits, allocator> string;
  4. 不能操作多字節(jié)或者變長字符的序列。
    在使用string類時(shí),必須包含#include頭文件以及using namespace std;

2.2 string類的常用接口說明

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

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

2. string類對象的容量操作

【C++初階】8. STL初階 + String類
這邊順便提一嘴,為啥會(huì)有兩個(gè)一樣的接口來返回字符串的有效長度呢?
一開始string類中只有l(wèi)ength接口,表示字符串的長度 后面出現(xiàn)STL庫,為了使其與STL庫中接口一致增加了size接口

注意:

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

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

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

2.3 string類的使用形式

string類±讀取

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

string類遍歷

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

迭代器的使用形式

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

capacity的使用

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

擴(kuò)size(resize) / 擴(kuò)capacity(recapacity)

【C++初階】8. STL初階 + String類
眾所周知,擴(kuò)容是有代價(jià)的,尤其是異地?cái)U(kuò)容,需要釋放前空間,再開辟新空間
但是,當(dāng)我們知道自己所需要的空間大小可不可以一次性開辟好呢?
【C++初階】8. STL初階 + String類
【C++初階】8. STL初階 + String類

尾插

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

任意位置插入/刪除string(不推薦)

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

賦值assign / 替換replace(不推薦)

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

c_str

【C++初階】8. STL初階 + String類
主要是為了C++兼容C語言的接口使用

substr

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

運(yùn)算符重載

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

3. 習(xí)題

3.1 反轉(zhuǎn)字符串

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

3.2 字符串相加

【C++初階】8. STL初階 + String類
不停的頭插,挪動(dòng)的數(shù)據(jù)越來越多,時(shí)間復(fù)雜度O(N2),所以推薦尾插并逆置

3.3 字符串中第一個(gè)唯一字符

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

3.4 字符串最后單詞長度

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

4. vs和g++下string結(jié)構(gòu)的說明

注意:下述結(jié)構(gòu)是在32位平臺下進(jìn)行驗(yàn)證,32位平臺下指針占4個(gè)字節(jié)。

vs下string的結(jié)構(gòu)

string總共占28個(gè)字節(jié),內(nèi)部結(jié)構(gòu)稍微復(fù)雜一點(diǎn),先是有一個(gè)聯(lián)合體,聯(lián)合體用來定義string中字符串的存儲(chǔ)空間:
當(dāng)字符串長度小于16時(shí),使用內(nèi)部固定的字符數(shù)組來存放
當(dāng)字符串長度大于等于16時(shí),從堆上開辟空間

union _Bxty
{ // storage for small buffer or pointer to larger one
 value_type _Buf[_BUF_SIZE];
 pointer _Ptr;
 char _Alias[_BUF_SIZE]; // to permit aliasing
} _Bx;

這種設(shè)計(jì)也是有一定道理的,大多數(shù)情況下字符串的長度都小于16,那string對象創(chuàng)建好之后,內(nèi)
部已經(jīng)有了16個(gè)字符數(shù)組的固定空間,不需要通過堆創(chuàng)建,效率高。
其次:還有一個(gè)size_t字段保存字符串長度,一個(gè)size_t字段保存從堆上開辟空間總的容量
最后:還有一個(gè)指針做一些其他事情。
故總共占16+4+4+4=28個(gè)字節(jié)。
【C++初階】8. STL初階 + String類
VS下使用的策略其實(shí)就是以空間換時(shí)間,當(dāng)長度<16的時(shí)候存儲(chǔ)在buff當(dāng)中 當(dāng)長度>=16時(shí)存儲(chǔ)在_ptr所指向的空間當(dāng)中

g++下string的結(jié)構(gòu)

G++下,string是通過寫時(shí)拷貝實(shí)現(xiàn)的,string對象總共占4個(gè)字節(jié),內(nèi)部只包含了一個(gè)指針,該指針將來指向一塊堆空間,內(nèi)部包含了如下字段:
空間總大小
字符串有效長度
引用計(jì)數(shù)

struct _Rep_base
{
 size_type _M_length;
 size_type _M_capacity;
 _Atomic_word _M_refcount;
};

指向堆空間的指針,用來存儲(chǔ)字符串
【C++初階】8. STL初階 + String類文章來源地址http://www.zghlxwxcb.cn/news/detail-403129.html

到了這里,關(guān)于【C++初階】8. STL初階 + String類的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【C++初階】九、STL容器中的string類(上)

    【C++初階】九、STL容器中的string類(上)

    ========================================================================= 相關(guān)代碼gitee自取 : C語言學(xué)習(xí)日記: 加油努力 (gitee.com) ?========================================================================= 接上期 : 【C++初階】八、初識模板(泛型編程、函數(shù)模板、類模板)-CSDN博客 ?==============================

    2024年02月04日
    瀏覽(28)
  • 【C++初階】STL詳解(二)string類的模擬實(shí)現(xiàn)

    【C++初階】STL詳解(二)string類的模擬實(shí)現(xiàn)

    本專欄內(nèi)容為:C++學(xué)習(xí)專欄,分為初階和進(jìn)階兩部分。 通過本專欄的深入學(xué)習(xí),你可以了解并掌握C++。 ??博主csdn個(gè)人主頁:小小unicorn ?專欄分類:C++ ??代碼倉庫:小小unicorn的代碼倉庫?? ??????關(guān)注我?guī)銓W(xué)習(xí)編程知識 注:為了防止與標(biāo)準(zhǔn)庫當(dāng)中的string類產(chǎn)生命名沖

    2024年02月05日
    瀏覽(32)
  • 【C++ STL】string類最全解析(什么是string?string類的常用接口有哪些?)

    【C++ STL】string類最全解析(什么是string?string類的常用接口有哪些?)

    目錄 一、前言 ?二、什么是 string ? ??? string 類的基本概念 ?? string 類與 char * 的區(qū)別? ??? string 類的作用 ??? 總結(jié) ?三、string 的常用接口詳解 ???string 類對象的默認(rèn)成員函數(shù) ① 構(gòu)造函數(shù)(初始化) ② 賦值重載(初始化) ??string 類對象的訪問及遍歷操作 ① operator[ ]

    2024年04月17日
    瀏覽(30)
  • 【C++初階】:string類

    【C++初階】:string類

    文檔里 一般使用 string里重載了一種非常厲害的運(yùn)算符[ ] 這個(gè)運(yùn)算符本質(zhì)上是解引用,是數(shù)組用來訪問數(shù)據(jù)的運(yùn)算符。所以我們可以用這個(gè)運(yùn)算符對每個(gè)字符進(jìn)行操作。補(bǔ)充個(gè)小知識:string是一個(gè)類,類里有許多的成員函數(shù),這些成員函數(shù)下面會(huì)講,這里先用一個(gè)size,代表字

    2024年02月08日
    瀏覽(16)
  • C++——模板(初階) + string

    C++——模板(初階) + string

    作者:幾冬雪來 時(shí)間:2023年5月19日 內(nèi)容:C++模板 + string講解 目錄 前言: 1.模板:? 1.函數(shù)模板的隱/顯示實(shí)例化:? 2.類模板: 2.STL:? 1.? 什么是STL:? 2.STL六大組件:? 3.string類:? 結(jié)尾:? 在上一篇博客我們結(jié)束了動(dòng)態(tài)管理的講解,并且在最后的時(shí)候我們引出了下一個(gè)學(xué)

    2024年02月05日
    瀏覽(19)
  • 【c++】STL--string

    【c++】STL--string

    ? ? ? ? 最開始我們學(xué)習(xí)c語言的時(shí)候,我們發(fā)現(xiàn)刷題或者寫代碼都是比較麻煩的,如果說用c語言造一輛車,那么我需要用c語言先把輪子造好--各個(gè)零件,當(dāng)我們造好之后再組裝。那么c++則是造好了輪子,只需要我們組裝就好了。這里的的STL里有各個(gè)組件,我只要熟悉的掌握

    2024年02月03日
    瀏覽(27)
  • [C++]模板初階與STL簡介

    [C++]模板初階與STL簡介

    目錄 模板初階與STL簡介:: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1.泛型編程 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.函數(shù)模板 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3.類模板 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4.什么是STL ? ? ? ? ? ? ? ? ?

    2023年04月25日
    瀏覽(16)
  • C++初階—string類(1)

    C++初階—string類(1)

    ? 目錄 1. 為什么要學(xué)習(xí)string類 1.1 C語言中的字符串 1.2 兩個(gè)面試題 2. 標(biāo)準(zhǔn)庫中的string類 3. string類對象的常見構(gòu)造 ?string常見構(gòu)造類的使用代碼演示 4. string類對象的容量操作 string容量相關(guān)方法使用代碼演示 5. string類對象的訪問及遍歷操作 string中元素訪問及遍歷代碼演示 6.

    2023年04月08日
    瀏覽(20)
  • C++ STL string類

    C++ STL string類

    目錄 一.為什么學(xué)習(xí)string類 (1) C語言中的字符串 (2)標(biāo)準(zhǔn)庫里面的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

    2024年02月13日
    瀏覽(24)
  • C++初階之模板和STL簡介

    C++初階之模板和STL簡介

    泛型編程是一種編程范式,旨在實(shí)現(xiàn)可重用、通用和高度抽象的代碼。它允許程序員編寫與數(shù)據(jù)類型無關(guān)的代碼,以便在不同的數(shù)據(jù)類型上進(jìn)行操作,而無需為每種數(shù)據(jù)類型重復(fù)編寫代碼。 在傳統(tǒng)的編程中,通常需要為每種數(shù)據(jù)類型編寫特定的代碼。例如,如果要實(shí)現(xiàn)一個(gè)排

    2024年02月16日
    瀏覽(18)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包