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的六大組件
String類
1. 為什么學(xué)習(xí)string類?
1.1 C語言中的字符串
C語言中,字符串是以’\0’結(jié)尾的一些字符的集合,為了操作方便,C標(biāo)準(zhǔn)庫中提供了一些str系列的庫函數(shù),但是這些庫函數(shù)與字符串是分離開的,不太符合OOP的思想,而且底層空間需要用戶自己管理,稍不留神可能還會(huì)越界訪問。
但是ASCII碼值只適用于英文,對于中文漢字來說無法實(shí)現(xiàn),這時(shí)候就出現(xiàn)了Unicode編碼(萬國碼)
2. 標(biāo)準(zhǔn)庫中的string類(string類的用法)
2.1 string類(了解)
string類的文檔介紹
- 字符串是表示字符序列的類
- 標(biāo)準(zhǔn)的字符串類提供了對此類對象的支持,其接口類似于標(biāo)準(zhǔn)字符容器的接口,但添加了專門用于操作單字節(jié)字符字符串的設(shè)計(jì)特性。
- string類是使用char(即作為它的字符類型,使用它的默認(rèn)char_traits和分配器類型(關(guān)于模板的更多信 息,請參閱basic_string)。
- string類是basic_string模板類的一個(gè)實(shí)例,它使用char來實(shí)例化basic_string模板類,并用char_traits和allocator作為basic_string的默認(rèn)參數(shù)(根于更多的模板信息請參考basic_string)。
- 注意,這個(gè)類獨(dú)立于所使用的編碼來處理字節(jié):如果用來處理多字節(jié)或變長字符(如UTF-8)的序列,這個(gè) 類的所有成員(如長度或大小)以及它的迭代器,將仍然按照字節(jié)(而不是實(shí)際編碼的字符)來操作。
總結(jié):
- string是表示字符串的字符串類
- 該類的接口與常規(guī)容器的接口基本相同,再添加了一些專門用來操作string的常規(guī)操作。
- string在底層實(shí)際是:basic_string模板類的別名,typedef basic_string <char, char_traits, allocator> string;
- 不能操作多字節(jié)或者變長字符的序列。
在使用string類時(shí),必須包含#include頭文件以及using namespace std;
2.2 string類的常用接口說明
1. string類對象的常見構(gòu)造
2. string類對象的容量操作
這邊順便提一嘴,為啥會(huì)有兩個(gè)一樣的接口來返回字符串的有效長度呢?
一開始string類中只有l(wèi)ength接口,表示字符串的長度 后面出現(xiàn)STL庫,為了使其與STL庫中接口一致增加了size接口
注意:
- size()與length()方法底層實(shí)現(xiàn)原理完全相同,引入size()的原因是為了與其他容器的接口保持一致,一般情況下基本都是用size()。
- clear()只是將string中有效字符清空,不改變底層空間大小。
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ù)減少,底層空間總大小不變。reserve(size_t res_arg=0)
:為string預(yù)留空間,不改變有效元素個(gè)數(shù),當(dāng)reserve的參數(shù)小于string的底層空間總大小時(shí),reserver不會(huì)改變?nèi)萘看笮 ?/li>
3. string類對象的訪問及遍歷操作
2.3 string類的使用形式
string類±讀取
string類遍歷
迭代器的使用形式
capacity的使用
擴(kuò)size(resize) / 擴(kuò)capacity(recapacity)
眾所周知,擴(kuò)容是有代價(jià)的,尤其是異地?cái)U(kuò)容,需要釋放前空間,再開辟新空間
但是,當(dāng)我們知道自己所需要的空間大小可不可以一次性開辟好呢?
尾插
任意位置插入/刪除string(不推薦)
賦值assign / 替換replace(不推薦)
c_str
主要是為了C++兼容C語言的接口使用
substr
運(yùn)算符重載
3. 習(xí)題
3.1 反轉(zhuǎn)字符串
3.2 字符串相加
不停的頭插,挪動(dòng)的數(shù)據(jù)越來越多,時(shí)間復(fù)雜度O(N2),所以推薦尾插并逆置
3.3 字符串中第一個(gè)唯一字符
3.4 字符串最后單詞長度
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é)。
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ù)文章來源:http://www.zghlxwxcb.cn/news/detail-403129.html
struct _Rep_base
{
size_type _M_length;
size_type _M_capacity;
_Atomic_word _M_refcount;
};
指向堆空間的指針,用來存儲(chǔ)字符串文章來源地址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)!