C++標(biāo)準(zhǔn)庫(kù)(C++ Standard Library),是類庫(kù)和函數(shù)的集合。?
C++編譯器廠商根據(jù)C++標(biāo)準(zhǔn)委員會(huì)官方的ISO規(guī)范并將其轉(zhuǎn)化為代碼。C++編譯器廠商在實(shí)現(xiàn)C++標(biāo)準(zhǔn)庫(kù)過(guò)程中必須依賴其不同操作系統(tǒng)所提供的系統(tǒng)調(diào)用接口,因此每個(gè)平臺(tái)都有其自己的C++標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)。
C++標(biāo)準(zhǔn)庫(kù)的特點(diǎn)如下:
A、C++標(biāo)準(zhǔn)庫(kù)不是C++語(yǔ)言標(biāo)準(zhǔn)的一部分,由類庫(kù)和函數(shù)庫(kù)組成。
B、C++標(biāo)準(zhǔn)庫(kù)中定義的類和對(duì)象都位于std命名空間中。
C、C++標(biāo)準(zhǔn)庫(kù)的頭文件都不帶.h后綴。
D、C++標(biāo)準(zhǔn)庫(kù)涵蓋了C庫(kù)的功能。
C++編譯環(huán)境組成如下:
C++編譯環(huán)境的組成如下:
A、不同的C++編譯器有自己不同的C++擴(kuò)展語(yǔ)法模塊
B、不同的C++編譯器有相同的C++標(biāo)準(zhǔn)語(yǔ)法模塊
C、不同的C++編譯器有自己的編譯器擴(kuò)展庫(kù)
D、為了便于軟件開發(fā),不同的C++編譯器附帶提供C語(yǔ)言兼容庫(kù),C語(yǔ)言兼容庫(kù)頭文件帶.h后綴,如#include
E、C++標(biāo)準(zhǔn)庫(kù)中包含一個(gè)涵蓋C庫(kù)功能的子庫(kù),通常頭文件以c開頭,如#include
F、不同的C++編譯器都有C++編譯器廠商實(shí)現(xiàn)的遵循C++標(biāo)準(zhǔn)的C++標(biāo)準(zhǔn)庫(kù),C++標(biāo)準(zhǔn)庫(kù)有相同的功能接口,但內(nèi)部實(shí)現(xiàn)不同。
C++標(biāo)準(zhǔn)庫(kù)是一組C++模板類,提供了通用的編程數(shù)據(jù)結(jié)構(gòu)和函數(shù),如鏈表、堆、數(shù)組、算法、迭代器等C++組件。C ++標(biāo)準(zhǔn)庫(kù)包含了C標(biāo)準(zhǔn)庫(kù),并在C++標(biāo)準(zhǔn)中進(jìn)行了定義。
C++編譯器開發(fā)廠商根據(jù)C++標(biāo)準(zhǔn)委員會(huì)官方發(fā)布的C++ ISO規(guī)范并將其轉(zhuǎn)化為代碼。C++編譯器廠商在編譯器實(shí)現(xiàn)過(guò)程中必須依賴其操作系統(tǒng)所提供的功能(讀/寫文件,分配內(nèi)存,創(chuàng)建線程等系統(tǒng)調(diào)用),因此每個(gè)平臺(tái)都有其自己的標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)。
在GNU/Linux上,C++標(biāo)準(zhǔn)庫(kù)通常由libstdc++或GNU標(biāo)準(zhǔn)C++庫(kù)項(xiàng)目實(shí)現(xiàn)。通常,所有常規(guī)的Linux發(fā)行版都默認(rèn)使用libstdc++。
在OS X Mavericks(V10.9)前的Mac OS上,libstdc++是默認(rèn)C++標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)。自O(shè)S X Mavericks開始,Apple切換到使用libc++作為C++標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)。
在Windows上,C++標(biāo)準(zhǔn)庫(kù)的實(shí)現(xiàn)一直嚴(yán)格限定在微軟官方的編譯器Visual Studio中。Windows上的C++標(biāo)準(zhǔn)庫(kù)通常稱為C/C++運(yùn)行時(shí)庫(kù)(CRT),涵蓋了C/C++二者的實(shí)現(xiàn)。
Windows最開始的C++標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)為CRTDLL.DLL庫(kù)。Windows 95開始,Microsoft開始將其遷移到MSVCRT [版本號(hào)]?.DLL(MSVCR20.DLL,MSVCR70.DLL等)上。?
Visual Studio 2015引入了深度的CRT重構(gòu)。C/C ++標(biāo)準(zhǔn)庫(kù)的實(shí)現(xiàn)遷移到一個(gè)新庫(kù),Universal C運(yùn)行時(shí)庫(kù) (Universal CRT或UCRT),編譯為UCRTBASE.DLL。 UCRT從Windows 10開始作為操作系統(tǒng)的一部分提供。
Bionic是Google為其Android操作系統(tǒng)所編寫的C標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn),直接在底層使用。第三方開發(fā)者可以通過(guò)Android原生開發(fā)工具包(NDK)訪問(wèn)Bionic,NDK可以使用C和C++代碼編寫Android應(yīng)用程序。
NDK提供了很多C++標(biāo)準(zhǔn)庫(kù)版本的實(shí)現(xiàn):
A、libc++,從Lollipop開始的官方安卓系統(tǒng)和現(xiàn)代Mac操作系統(tǒng)都將其作為C++標(biāo)準(zhǔn)庫(kù)使用。從NDK發(fā)布17版本開始,成為NDK中唯一可用的C++標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)。
B、gnustl,libstdc++的別名,在NDK發(fā)布18中刪除。
C、STLport,由STLport項(xiàng)目編寫的C++標(biāo)準(zhǔn)庫(kù)的第三方實(shí)現(xiàn),自2008年以來(lái)一直處于不活躍狀態(tài)。STLport在NDK發(fā)布18中移除。
C++標(biāo)準(zhǔn)庫(kù)也有不同的實(shí)現(xiàn)版本:Apache版C++標(biāo)準(zhǔn)庫(kù),uSTL以及EASTL等等。Apache版本C++標(biāo)準(zhǔn)庫(kù)注重可移植性。
:定義list序列模板,是一個(gè)序列的鏈表,常常在任意位置插入和刪除元素。
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
string s = "Hello, C++ Library.";
cout << s <
上述代碼中,使用了C++標(biāo)準(zhǔn)庫(kù)中的string類和iostream流類。
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
string s = "Hello, C module of C++ Library.";
cout << s <
上述代碼中,使用了C++標(biāo)準(zhǔn)庫(kù)中的string類、iostream流類,以及C++標(biāo)準(zhǔn)庫(kù)中C庫(kù)的cmath庫(kù)。
#include
#include
int main(int argc, char *argv[])
{
const char* s = "Hello, C Compatible Library.";
printf("%s\n", s);
double d = sqrt(4);
printf("%lf\n", d);
return 0;
}
上述代碼中,使用了C兼容庫(kù)的stdio庫(kù)和math庫(kù)。
C語(yǔ)言不支持真正意義上的字符串,但可以使用字符數(shù)組和一組函數(shù)實(shí)現(xiàn)字符串操作。C語(yǔ)言不支持自定義類型,因此也不能定義字符串類型。
C++語(yǔ)言可以自定義類型,可以通過(guò)類完成字符串類型的定義,但C++語(yǔ)言也沒(méi)有原生的字符串類型。
C++語(yǔ)言通過(guò)C++標(biāo)準(zhǔn)庫(kù)提供的string類型實(shí)現(xiàn)對(duì)字符串類型的支持。
string類的特性如下:
A、string直接支持字符串連接
B、string直接支持字符串的大小比較
C、string直接支持子串查找和提取
D、string直接支持字符串的插入和替換
C++標(biāo)準(zhǔn)庫(kù)提供了相關(guān)類對(duì)字符串和數(shù)字進(jìn)行轉(zhuǎn)換。
字符串流類sstream用于string的轉(zhuǎn)換。
使用字符串流類需要包含#include
istringstream表示字符串輸入流,ostringstream表示字符串輸出流。
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
//字符串轉(zhuǎn)換為數(shù)字
istringstream iss("3.14");
double pi;
if(iss >> pi)
{
cout << "PI = " << pi<< endl;
}
//數(shù)字轉(zhuǎn)換為字符串
ostringstream oss;
if(oss << pi)
{
string PI = oss.str();
cout << "PI = " << PI << endl;
}
return 0;
}
#include
#include
#include
using namespace std;
string operator >> (const string& s, int n)
{
string ret;
unsigned int pos = 0;
//右移位數(shù)計(jì)算
n = n % s.length();
//右移的開始位置
pos = s.length() - n;
//右移部分的子串作為起始
ret = s.substr(pos);
//連接未移動(dòng)子串
ret += s.substr(0,pos);
return ret;
}
int main(int argc, char *argv[])
{
string s = "abcdef";
cout << (s >> 3) << endl;//"defabc"
return 0;
}
string類內(nèi)部通過(guò)一個(gè)數(shù)據(jù)空間保存字符數(shù)據(jù),通過(guò)一個(gè)成員變量保存當(dāng)前字符串的長(zhǎng)度。因此,C++開發(fā)中不能使用C語(yǔ)言的方式對(duì)string的存儲(chǔ)空間進(jìn)行直接操作,而應(yīng)該使用string提供的接口函數(shù)進(jìn)行字符串操作。
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
string s = "12345";
s.reserve(20);
//直接對(duì)string對(duì)象的存儲(chǔ)空間進(jìn)行操作
for(int i = 0; i < 5; i++)
{
s[5+i] = 'a'+i;
}
cout << s << endl;//12345
//string對(duì)象的存儲(chǔ)空間修改結(jié)果如下:
for(int i = 0; i < 5; i++)
{
cout << s[5+i] << endl;
}
//通過(guò)string類接口進(jìn)行字符串操作
s.append("ABCD");
cout << s <
上述代碼中,直接對(duì)string對(duì)象的底層數(shù)據(jù)進(jìn)行字符串操作后,使用string類的接口可能不能訪問(wèn)到對(duì)string對(duì)象底層數(shù)據(jù)的修改。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。