iostream
定義了用于讀寫(xiě)流的基本類(lèi)型,用于處理控制臺(tái)IO,fstream
定義了讀寫(xiě)命名文件的類(lèi)型,sstream
定義了讀寫(xiě)內(nèi)存string對(duì)象的類(lèi)型fstream
和stringstream
都是繼承自類(lèi)iostream
,輸入類(lèi)都繼承自istream
,輸出類(lèi)都繼承自ostream
,因此在istream
對(duì)象上執(zhí)行的操作,也可在ifstream
和istringstream
對(duì)象上執(zhí)行while(cin >>word)
,while循環(huán)檢查>>
表達(dá)式返回的流的狀態(tài),如果輸入操作成功,流保持有效狀態(tài),則條件為真os<< "hello";
,文本串可能會(huì)立即打印,也可能被保存在緩沖區(qū)中,導(dǎo)致緩沖刷新(數(shù)據(jù)真正寫(xiě)到輸出設(shè)備中)的原因有:① 程序正常結(jié)束;② 緩沖區(qū)滿;③ 使用endl
(添加換行)或flush
(不添加)或ends
(添加空字符)操作符顯式刷新緩沖區(qū);④ 使用unitbuf
操作符使流在每次寫(xiě)操作后都進(jìn)行一次flush
操作;⑤ 一個(gè)輸出流可能被關(guān)聯(lián)到另一個(gè)流,當(dāng)讀寫(xiě)被關(guān)聯(lián)的流時(shí),關(guān)聯(lián)到的流緩沖區(qū)會(huì)被刷新,默認(rèn)情況下cin
和cerr
都關(guān)聯(lián)到cout
open()
將它與文件關(guān)聯(lián)起來(lái),如果調(diào)用失敗則不能使用該對(duì)象,此時(shí)和cin
一樣返回false,對(duì)一個(gè)已經(jīng)打開(kāi)的文件流調(diào)用open()
會(huì)失敗,并導(dǎo)致該對(duì)象不能被使用,為了將文件流關(guān)聯(lián)到另一個(gè)文件,必須先用成員函數(shù)close()
關(guān)閉已經(jīng)關(guān)聯(lián)的文件,當(dāng)一個(gè)fstream
對(duì)象離開(kāi)其作用域時(shí),與之關(guān)聯(lián)的文件會(huì)自動(dòng)關(guān)閉(對(duì)象銷(xiāo)毀時(shí),close()
自動(dòng)調(diào)用)9.1 順序容器概述
成都創(chuàng)新互聯(lián)公司專注于景縣網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供景縣營(yíng)銷(xiāo)型網(wǎng)站建設(shè),景縣網(wǎng)站制作、景縣網(wǎng)頁(yè)設(shè)計(jì)、景縣網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造景縣網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供景縣網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。
- vector:可變大小數(shù)組。支持快速隨機(jī)訪問(wèn)。在尾部之外的位置插入或刪除元素很慢
- deque:雙端隊(duì)列。支持快速隨機(jī)訪問(wèn)。在頭尾位置插入和刪除速度很快
- list:雙向鏈表。只支持雙向順序訪問(wèn)。在list中任何位置進(jìn)行插入和刪除操作速度都很快
- forward_list:?jiǎn)蜗蜴湵?。只支持單向順序訪問(wèn)。在鏈表中任何位置進(jìn)行插入和刪除操作都很快
- array:固定大小數(shù)組。支持快速隨機(jī)訪問(wèn)。不能添加或刪除元素。與內(nèi)置數(shù)組相比,array是一種更安全、更易用的數(shù)組類(lèi)型
- string:與vector類(lèi)似,但專門(mén)用于保存字符
- 類(lèi)型別名:①
iterator
/const_iterator
:此容器類(lèi)型的迭代器類(lèi)型;②size_type
:無(wú)符號(hào)整數(shù)類(lèi)型,可保存此容器類(lèi)型大可能大?。虎?code>difference_type:帶符號(hào)整數(shù)類(lèi)型,可保存兩個(gè)迭代器之間的距離;④vaule_type
:元素類(lèi)型;⑤reference
/const_reference
:元素的左值類(lèi)型- 構(gòu)造函數(shù):①
C c;
:默認(rèn)構(gòu)造函數(shù),構(gòu)造空容器;②C c1(c2);
:拷貝構(gòu)造函數(shù);③C c(b,e);
將迭代器b和e范圍內(nèi)的元素拷貝到c(array不支持);④C c{x,y,z};
:列表初始化- 賦值與swap:①
c1=c2;
;②c={x,y,z};
;③c1.swap(c2);
;(swap通常比拷貝快得多)④swap(c1,c2);
(最好統(tǒng)一使用非成員版本的swap,適用于泛型編程)- 大小:①
c.size()
:c中元素?cái)?shù)目(不支持forward_list);②c.max_size()
:c中可保存的大元素?cái)?shù)目;③c.empty()
- 添加刪除元素(array不支持,不同容器中這些操作的接口都不同):①
c.insert(args)
;②c.emplace(inits)
;③c.erase(args)
;④c.clear()
- 關(guān)系運(yùn)算符:①
==
/!=
:所有容器都支持;②<
/<=
/>
/>=
:無(wú)序關(guān)聯(lián)容器不支持- 獲取迭代器:
c.begin(),c.end()
/c.cbegin(),c.cend()
- 反向容器的額外成員(不支持forward_list):①
reverse_iterator
/const_reverse_iterator
;②c.rbegin(),c.rend()
/c.crbegin(),c.crend()
9.2 順序容器專有操作
- 初始化(array不可用):①
C seq(n);
:seq包含n個(gè)元素,對(duì)這些元素進(jìn)行值初始化,此構(gòu)造函數(shù)是explicit的(string不可用);②C seq(n,t);
:seq包含n個(gè)初始化為t的元素- 賦值(array不適用):①
seq.assign(b,e);
:將seq中元素替換為迭代器b和e范圍內(nèi)的元素,b和e不能指向seq本身;②seq.assign(il);
:將seq中的元素替換為初始化列表il中的元素;③seq.assign(n,t);
:將seq中的元素替換為n個(gè)值為t的元素- 添加元素(array不可用):①
c.push_back(t)
/c.emplace_back(args)
:在c的尾部創(chuàng)建一個(gè)值為t或由args創(chuàng)建的元素,返回void(forward_list不可用);②c.push_front(t)
/c.emplace_front(args)
:在c的頭部創(chuàng)建一個(gè)元素,返回void(vector和string不可用);③c.insert(p,t)
/c.emplace(p,args)
:在迭代器p指向的元素之前創(chuàng)建一個(gè)元素,返回指向新添加的元素的迭代器;④c.insert(p,n,t)
/c.insert(p,b,e)
/c.insert(p,il)
- 訪問(wèn)元素(返回的均為引用):①
c.back()
(forward_list不可用);②c.front()
;③c[n]
/c.at(n)
(只能用于string、vector、deque、array)- 刪除元素:①
c.pop_back()
:刪除c中尾元素(forward_list不可用);②c.pop_front()
:刪除c中首元素(vector和string不可用);③c.erase(p)
:刪除迭代器p所指向元素,返回被刪元素之后元素的迭代器;④c.erase(b,e)
:刪除迭代器b和e范圍內(nèi)的元素,返回最后一個(gè)被刪元素之后元素的迭代器;⑤c.clear()
:刪除c中所有元素,返回void- 改變?nèi)萜鞔笮。孩?code>c.resize(n):調(diào)整c的大小為n個(gè)元素,添加的新元素進(jìn)行值初始化,若n小于原長(zhǎng)度,則多出的元素被丟棄;②
c.resize(n,t)
:添加的新元素初始化為值t
at()
成員函數(shù)時(shí)如果下標(biāo)越界,會(huì)拋出out_of_range異常insert_after
、emplace_after
、erase_after
的操作,并且定義了首前迭代器before_begin
,該迭代器允許在鏈表首元素之前添加或刪除元素c.capacity()
:不重新分配內(nèi)存空間的話,c可以保存多少元素;②c.reserve(n)
:分配至少能容納n個(gè)元素的內(nèi)存空間;③c.shrink_to_fit()
:將能保存的元素空間縮大小減為當(dāng)前的元素個(gè)數(shù)9.3 額外的string操作
string s(cp,n)
:s是cp指向數(shù)組中前n個(gè)字符的拷貝,此數(shù)組至少包含n個(gè)字符;②string s(s2,pos2)
:s是s2從下標(biāo)pos2開(kāi)始的字符的拷貝;③string s(s2,pos2,len2)
:s是s2從下標(biāo)pos2開(kāi)始len2個(gè)字符的拷貝;④s.substr(pos,n)
:子字符串操作,返回一個(gè)string,包含s中從pos開(kāi)始的n個(gè)字符的拷貝s,insert(pos,args)
;②s.erase(pos,len)
;③s.assign(args)
;④s.append(args)
;⑤a.replace(range,args)
。其中args可以是下列形式之一:str
/str,pos,len
/cp,len
/cp
/n,c
/b,e
/初始化列表
string::size_type
值,表示匹配發(fā)生位置的下標(biāo),如果搜索失敗,則返回一個(gè)名為string::npos
的static成員,二者均為unsign類(lèi)型:①s.find(args)
/s.rfind(args)
:查找s中args第一次/最后一次出現(xiàn)的位置;②s.find_first_of(args)
/s.find_last_of(args)
:在s中查找arg中任何一個(gè)字符第一次/最后一次出現(xiàn)的位置;③s.find_first_not_of(args)
/s.find_last_not_of(args)
:在s中查找第一個(gè)/最后一個(gè)不在args中的字符。其中args是以下形式之一:c,pos
/s2,pos
/cp,pos
/cp,pos,n
s.compare(args)
的參數(shù)形式有:s2
/pos1,n1,s2
/pos1,n1,s2,pos2,n2
/cp
/pos1,n1,cp
/pos1,n1,cp,n2
to_string(val)
:將數(shù)值類(lèi)型轉(zhuǎn)為string;②stoi(s,p,b)
/stol(s,p,b)
/stoul(s,p,b)
/stoll(s,p,b)
/stoull(s,p,b)
:將s轉(zhuǎn)為整型,b表示轉(zhuǎn)換用的基數(shù),默認(rèn)為10,p是size_t指針,用來(lái)保存s中第一個(gè)非數(shù)值字符的下標(biāo),默認(rèn)為0,即不保存下標(biāo);③stof(s,p)
/stod(s,p)
/stold(s,p)
:將s轉(zhuǎn)為浮點(diǎn)型9.4 容器適配器
stackstk(seq);
,默認(rèn)情況下stack和queue是基于deque實(shí)現(xiàn)的,可以在創(chuàng)建一個(gè)適配器時(shí)將一個(gè)命名的順序容器作為第二個(gè)類(lèi)型參數(shù),來(lái)重載默認(rèn)容器類(lèi)型stack>str_stk;
container_type
類(lèi)型訪問(wèn)底層容器類(lèi)型s.pop()
;②s.push(item)
/s.emplace(args)
:③s.top()
q.pop()
;②q.front()
;③q.back()
(只能用于queue);④q.top()
(只能用于priority_queue);⑤q.push(item)
/q.emplace(args)
10.1 泛型算法概述
中,還有一組數(shù)值泛型算法定義在頭文件
中。一般情況下,這些算法并不直接操作容器,而是遍歷由兩個(gè)迭代器指定的一個(gè)元素范圍來(lái)進(jìn)行操作,如auto result=find(vec.cbegin(),vec.cend(),val);
,如果發(fā)現(xiàn)匹配元素,則返回指向該元素的迭代器,否則返回尾后迭代器find()
函數(shù)和count()
函數(shù)都是只讀算法,定義在頭文件
中的accumulate()
函數(shù)也是只讀算法,equal(r1.cbegin(),r1.cend(),r2.cbegin())
函數(shù)用于比較兩個(gè)序列是否保存相同的值,該函數(shù)接受三個(gè)迭代器,前兩個(gè)表示第一個(gè)序列的范圍,第三個(gè)表示第二個(gè)序列的首元素,這種只接受一個(gè)單一迭代器來(lái)表示第二個(gè)序列的算法,都假定第二個(gè)序列至少與第一個(gè)序列一樣長(zhǎng)fill(vec.begin(),vec.end(),10)
向給定序列中寫(xiě)入數(shù)據(jù);②fill_n(vec.begin(),n,0)
:必須保證vec至少包含n個(gè)元素/fill_n(back_inserter(vec),n,0)
:使用插入迭代器back_inserter會(huì)調(diào)用push_back來(lái)添加元素;③copy(bigin(a1),end(a1),a2)
:把a(bǔ)1的內(nèi)容拷貝給a2;④replace(ilst.cbegin(),ilst.cend(),0,10)
:將序列中所有0替換為10/replace_copy(ilst.cbegin(),ilst.cend(),back_inserter(ivec),0,10)
:ilst不變,ilst中0替換為10后拷貝到ivec中sort()
:排序;②unique()
:去除相鄰重復(fù)項(xiàng);以下步驟消除vector中的重復(fù)單詞sort(v.begin(),v.end()); //排序
auto end_unique = unique(v.begin(),v.end()); //unique函數(shù)實(shí)現(xiàn)無(wú)重復(fù)排列,返回指向不重復(fù)區(qū)域的尾后迭代器
v.erase(end_unique,v.end()); //刪除重復(fù)單詞
10.2 定制操作
<
或=
運(yùn)算符來(lái)比較。標(biāo)準(zhǔn)庫(kù)還為這些算法提供了額外的版本,使得能夠用自己定義的操作來(lái)代替默認(rèn)運(yùn)算符sort()
函數(shù)用謂詞代替<
來(lái)比較元素,如sort(words.begin(),words.end(),isShorter)
,若想要保證穩(wěn)定排序,可使用stable_sort()
函數(shù)[capture list] (parameter list) ->return type {function body}
其中,捕獲列表是一個(gè)lambda所在函數(shù)中定義的局部變量的列表,通常為空,參數(shù)列表、返回類(lèi)型、函數(shù)體與普通函數(shù)一樣,但是lambda必須使用尾置返回來(lái)指定返回類(lèi)型。lambda可以忽略參數(shù)列表和返回類(lèi)型,但必須包含捕獲列表和函數(shù)體:auto f = []{return 10;};
,忽略參數(shù)列表即參數(shù)列表為空,忽略返回類(lèi)型則從函數(shù)體代碼中推斷返回類(lèi)型,若函數(shù)體中包含單一return之外的內(nèi)容且未指定返回類(lèi)型,則返回void
//將words按長(zhǎng)度穩(wěn)定排序
stable_sort(words.begin(),words.end(),[](const string &a,const string &b){return a.size()return a.size()>=sz;});
//從wc迭代器開(kāi)始打印單詞,每個(gè)單詞后接一個(gè)空格
for_each(wc,words.end(),[](const string &s){cout<
[a]
)或引用捕獲[&a]
,采用值捕獲的前提是變量可以拷貝,被值捕獲的變量是在lambda創(chuàng)建時(shí)拷貝,而非調(diào)用時(shí),因此隨后對(duì)其的修改不會(huì)影響到lambda內(nèi)對(duì)應(yīng)的值,當(dāng)以引用方式捕獲一個(gè)變量時(shí),必須保證在lambda執(zhí)行時(shí)變量是存在的[&]
或[=]
,&告訴編譯器采用引用捕獲方式,=采用值捕獲方式。當(dāng)混用隱式捕獲和顯式捕獲時(shí),捕獲列表中第一個(gè)元素必須是&或=auto f=[v]()mutable{return ++v;};
,一個(gè)引用捕獲的變量是否可以修改依賴于該引用指向的是一個(gè)const類(lèi)型還是非const類(lèi)型bind()
函數(shù),該函數(shù)定義在頭文件
中,可以將bind函數(shù)看作一個(gè)通用的函數(shù)適配器,接受一個(gè)可調(diào)用對(duì)象,生成一個(gè)新的可調(diào)用對(duì)象auto newCallable = bind(callable,arg_list);
,當(dāng)調(diào)用newCallable時(shí),會(huì)調(diào)用callable,并傳給它arg_list中的參數(shù),arg_list是一個(gè)逗號(hào)分隔的參數(shù)列表,其中形如_n
的參數(shù)代表占位符,綁定引用參數(shù)時(shí)要使用ref()
或cref()
函數(shù):bind(print,ref(os),_1,' ')
10.3 再探迭代器
中還定義了額外幾種迭代器,包括:插入迭代器、流迭代器、反向迭代器、移動(dòng)迭代器back_inserter(c)
創(chuàng)建一個(gè)使用c.push_back(t)
的迭代器;②front_inserter(c)
創(chuàng)建一個(gè)使用c.push_front(c)
的迭代器;③inserter(c,iter)
創(chuàng)建一個(gè)使用c.insert(iter,t)
的迭代器。使用插入器時(shí),只需要iter=t;
即可在iter指定的位置處插入值tistream_iterator
讀取輸入流,ostream_iterator
向一個(gè)輸出流寫(xiě)數(shù)據(jù)istream_iteratorin(is); //in從輸入流is讀取類(lèi)型為T(mén)的值
istream_iteratorend; //讀取類(lèi)型為T(mén)的尾后迭代器
ostream_iteratorout(os); //out將類(lèi)型為T(mén)的值寫(xiě)到輸出流os中
ostream_iteratorout(os,d); //out將類(lèi)型為T(mén)的值寫(xiě)到輸出流os中,且每個(gè)值后都輸出一個(gè)d,d為C風(fēng)格的字符串
rbegin(),rend(),crbegin(),crend()
成員函數(shù)來(lái)獲得反向迭代器,反向迭代器調(diào)用base()
成員函數(shù)可以得到正向迭代器,但是指向的元素不同(正向迭代器指向后一個(gè)元素)10.4 泛型算法結(jié)構(gòu)
- 輸入迭代器:只讀,不寫(xiě),單遍掃描,只能遞增;
- 輸出迭代器:只寫(xiě),不讀,單遍掃描,只能遞增;
- 前向迭代器:可讀寫(xiě),多遍掃描,只能遞增;
- 雙向迭代器:可讀寫(xiě),多遍掃描,可遞增遞減;
- 隨機(jī)訪問(wèn)迭代器:可讀寫(xiě),多遍掃描,支持全部迭代器運(yùn)算
- 輸入迭代器:① 用于比較兩個(gè)迭代器的相等
==
和不相等運(yùn)算符!=
;② 迭代器的前置和后置遞增運(yùn)算++
;③ 用于讀取元素的解引用運(yùn)算符*
(只會(huì)出現(xiàn)在賦值運(yùn)算符的右側(cè));④ 用于解引用迭代器并提取成員的箭頭運(yùn)算符->
- 輸出迭代器:與1類(lèi)似,解引用運(yùn)算符只能出現(xiàn)在賦值運(yùn)算符的左側(cè)
- 前向迭代器:1和2會(huì)破環(huán)迭代器原本結(jié)構(gòu),只能單遍掃描,前向迭代器可以保存當(dāng)前狀態(tài),多次讀寫(xiě)同一個(gè)元素
- 雙向迭代器:還支持前置和后置的遞減運(yùn)算符
--
- 隨機(jī)訪問(wèn)迭代器:還支持 ① 用于比較兩個(gè)迭代器相對(duì)位置的關(guān)系運(yùn)算符
<,<=,>,>=
;② 迭代器和一個(gè)整數(shù)值的加減運(yùn)算+,+=,-,-=
;③ 用于兩個(gè)迭代器的減法運(yùn)算-
;④ 下標(biāo)運(yùn)算符iter[n],*iter[n]
(兩者等價(jià))
ostream_iterator
alg(beg,end,other args);
alg(beg,end,dest,other args);
alg(beg,end,beg2,other args);
alg(beg,end,beg2,end2,other args);
<
或==
;② 接受一個(gè)元素值的算法通常會(huì)有一個(gè)不同名的后綴加上_if
的版本,該版本接受一個(gè)謂詞代替元素值,如find
和find_if
;③ 默認(rèn)情況下,重排元素的算法將重排后的元素寫(xiě)回給定的輸入序列中,通常提供額外的拷貝版本,加上后綴_copy
,如reverse
和reverse_copy
sort(),merge(),remove(),reverse(),unique()
算法,通用版本的sort要求隨機(jī)訪問(wèn)迭代器,因此不能用于鏈表類(lèi)型11.1 關(guān)聯(lián)容器概述
map
和set
,標(biāo)準(zhǔn)庫(kù)提供8個(gè)關(guān)聯(lián)容器,其不同體現(xiàn)在3個(gè)維度上:① set或map;② 是否允許重復(fù)的關(guān)鍵字,允許重復(fù)關(guān)鍵字的容器以multi
開(kāi)頭;③ 是否按順序保存元素,不按關(guān)鍵字順序存儲(chǔ)的容器以unordered_
開(kāi)頭multimap
定義在頭文件
中,set和multiset
定義在頭文件
中,unordered_multimap
和unordered_multiset
定義在頭文件
和
中<
運(yùn)算符來(lái)比較兩個(gè)關(guān)鍵字
中,定義了名為pair
的標(biāo)準(zhǔn)庫(kù)類(lèi)型,一個(gè)pair保存兩個(gè)數(shù)據(jù)成員,當(dāng)創(chuàng)建一個(gè)pair時(shí),必須提供兩個(gè)類(lèi)型名,pair的默認(rèn)構(gòu)造函數(shù)對(duì)數(shù)據(jù)成員進(jìn)行值初始化,map中的元素是pair,標(biāo)準(zhǔn)庫(kù)中的pair操作包括:①pairp
;②pairp(v1,v2)
;③make_pair(v1,v2)
;④p.first
,p.second
11.2 關(guān)聯(lián)容器操作
key_value
:關(guān)鍵字類(lèi)型;②mapped_type
:map的值類(lèi)型;③value_type
:對(duì)于set為關(guān)鍵字類(lèi)型,對(duì)于map為pair
value_type
的值的引用。對(duì)map而言,會(huì)返回一個(gè)pair類(lèi)型,其first成員保存const關(guān)鍵字,不能修改,second成員保存值,可以修改;對(duì)set而言,會(huì)返回const關(guān)鍵字,不能修改。當(dāng)使用一個(gè)迭代器遍歷一個(gè)有序關(guān)聯(lián)容器時(shí),迭代器按關(guān)鍵字升序遍歷元素auto m_it = m.cbegin();
while(m_it != m.cend()){cout<< m_it->first<< ":"<< m_it->second<< endl;
++m_it;
}
insert()
成員向容器中添加一個(gè)元素或一個(gè)元素范圍,由于map和set包含不重復(fù)的關(guān)鍵字,因此插入一個(gè)已存在的元素對(duì)容器沒(méi)有任何影響:①c.insert(v)
/c.emplace(args)
:v為value_type類(lèi)型的對(duì)象,args用來(lái)構(gòu)造一個(gè)元素;②c.insert(b,e)
/c.insert(il)
:b和e是迭代器,il是花括號(hào)列表;③c.insert(p,v)
/c.emplace(p,args)
:將迭代器p作為一個(gè)提示,指出從哪里開(kāi)始搜索新元素應(yīng)該存儲(chǔ)的位置。對(duì)于不包括重復(fù)關(guān)鍵字的容器,添加單一元素的insert和emplace返回一個(gè)pair,pair的first成員是一個(gè)迭代器,指向具有給定關(guān)鍵字的元素,second成員是一個(gè)bool值,指出元素是插入成功還是已存在于容器中c.erase(k)
:從c中刪除每個(gè)關(guān)鍵字為k的元素,返回刪除元素的數(shù)量;②c.erase(p)
:從c中刪除迭代器p指定的元素,返回一個(gè)p之后的迭代器;③c.erase(b.e)
:刪除迭代器b和e范圍中的元素,返回ec[k]
:返回關(guān)鍵字為k的元素,若k不在c中,添加一個(gè)關(guān)鍵字為k的元素,對(duì)其進(jìn)行值初始化;②c.at(k)
:訪問(wèn)關(guān)鍵字為k的元素,若k不在c中,拋出一個(gè)out_of_range異常c.find(k)
:返回一個(gè)迭代器,指向第一個(gè)關(guān)鍵字為k的元素,若k不在容器中,則返回尾后迭代器;②c.count(k)
:返回關(guān)鍵字等于k的元素的數(shù)量;③c.lower_bound(k)
:返回一個(gè)迭代器,指向第一個(gè)關(guān)鍵字不小于k的元素(不適用于無(wú)序容器);④c.upper_bound(k)
:返回一個(gè)迭代器,指向第一個(gè)關(guān)鍵字大于k的元素(可與上一個(gè)函數(shù)一起給定在multimap或multiset中某個(gè)關(guān)鍵字對(duì)應(yīng)的迭代器范圍);⑤c.equal_range(k)
:返回一個(gè)迭代器pair,表示關(guān)鍵字等于k的元素的范圍,若k不存在,pair兩個(gè)成員均等于c.end()12.1 對(duì)象與內(nèi)存分配關(guān)系
12.2 動(dòng)態(tài)內(nèi)存與智能指針
new
:在動(dòng)態(tài)內(nèi)存中為對(duì)象分配空間并返回一個(gè)指向該對(duì)象的指針;②delete
:接受一個(gè)動(dòng)態(tài)對(duì)象的指針,銷(xiāo)毀該對(duì)象并釋放與之關(guān)聯(lián)的內(nèi)存shared_ptr
:允許多個(gè)指針指向同一個(gè)對(duì)象;②unique_ptr
:獨(dú)占所指向的對(duì)象。標(biāo)準(zhǔn)庫(kù)還定義了一個(gè)名為weak_ptr
的伴隨類(lèi),它是一種弱引用,指向shared_ptr所管理的對(duì)象,這三種類(lèi)型都定義在
頭文件中shared_ptrp1;
,智能指針的使用方法與普通指針類(lèi)似,解引用一個(gè)智能指針?lè)祷厮赶虻膶?duì)象,如果在一個(gè)條件判斷中使用智能指針,就是檢測(cè)它是否為空shared_ptrsp
/unique_ptrup
:空智能指針;②p.get()
:返回p中保存的指針,要小心使用,若智能指針釋放了其對(duì)象,返回的指針?biāo)赶虻膶?duì)象也就消失了;③swap(p,q)
/p.swap(q)
:交換p和q中的指針make_shared(args)
:返回一個(gè)指向類(lèi)型T對(duì)象的智能指針,使用args初始化此對(duì)象;②sharedp(q)
:p是q的拷貝,此操作會(huì)遞增q中的計(jì)數(shù)器,q中的指針必須能轉(zhuǎn)換為T(mén)*;③p = q
:p和q所保存的指針必須能相互轉(zhuǎn)換,此操作會(huì)遞減p的引用計(jì)數(shù),遞增q的引用計(jì)數(shù),若p的引用計(jì)數(shù)變?yōu)?,則將其管理的原內(nèi)存釋放;④p.use_count()
:返回與p共享對(duì)象的智能指針對(duì)象,該操作很慢,主要用于調(diào)試;⑤p.unique()
:若p.use_count()為1,返回true,否則返回falseint *p = new int;
,*p的值未定義,在類(lèi)型名后跟一對(duì)括號(hào)即可對(duì)動(dòng)態(tài)分配的對(duì)象進(jìn)行值初始化:int *p = new int();
:*p的值為0auto p = new auto(obj);
,p指向一個(gè)與obj類(lèi)型相同的對(duì)象,該對(duì)象用obj進(jìn)行初始化,當(dāng)且僅當(dāng)括號(hào)中有單一初始化器時(shí)才可使用autoconst int *p = new const int(10);
,new返回的指針是一個(gè)指向const的指針int* p = new (nothrow) int;
的方式阻止拋出異常,這種形式的new稱為定位new12.3 智能指針的使用
shared_ptrp(new int(10));
,接受指針參數(shù)的智能指針構(gòu)造函數(shù)是explicit的,因此不能將一個(gè)內(nèi)置指針隱式轉(zhuǎn)換為一個(gè)智能指針,必須使用直接初始化的形式shared_ptrp(q)
:p管理內(nèi)置指針q所指向的對(duì)象,q必須指向new分配的內(nèi)存,且能偶轉(zhuǎn)換為T(mén)*類(lèi)型;②shared_ptrp(u)
:p從unique_ptr u那里接管了對(duì)象的所有權(quán),將u置為空;③shared_ptrp(q,d)
:p使用可調(diào)用對(duì)象d來(lái)代替delete;④shared_ptrp(p2,d)
:p是shared_ptr p2的拷貝;⑤p.reset()
/p.reset(q)
/p.reset(q,d)
:若p是唯一指向其對(duì)象的shared_ptr,reset會(huì)釋放此對(duì)象,并將p置為空;若傳遞了參數(shù)內(nèi)置指針q,會(huì)令p指向q;若還傳遞了參數(shù)d,會(huì)調(diào)用d來(lái)代替deleteshared_ptrp(&con,disconnection);
,此時(shí)資源會(huì)自動(dòng)釋放unique_ptru(d)
:創(chuàng)建一個(gè)空unique_ptr,指向類(lèi)型為T(mén)的對(duì)象,用類(lèi)型為D的對(duì)象d代替delete;②u.release()
:放棄對(duì)指針的控制權(quán),將u置為空并返回指針;③u.reset()
/u.reset(q)
/u.reset(nullptr)
:釋放u指向的對(duì)象,如果提供了內(nèi)置指針q,令u指向這個(gè)對(duì)象,否則將u置為空unique_ptrp2(p1.release())
/p2.reset(p1.release())
。直接使用release并不會(huì)釋放內(nèi)存,而且會(huì)丟失指針。可以拷貝或賦值一個(gè)將要被銷(xiāo)毀的unique_ptr,如從函數(shù)返回一個(gè)unique_ptr。重載一個(gè)unique_ptr的刪除器必須在尖括號(hào)中提供刪除器類(lèi)型:unique_ptrp(&con,disconnection);
weak_ptrw(sp)
/w = sp
:將w指向shared_ptr指針sp指向的對(duì)象;②w.reset()
:將w置為空;③w.use_count()
:與w共享的shared_ptr的數(shù)量;④w.expired()
:若w.use_count()為0,返回true,否則返回false;⑤w.lock()
:若w.expired()為true,返回一個(gè)空shared_ptr,否則返回一個(gè)指向w的對(duì)象的shared_ptr12.4 動(dòng)態(tài)數(shù)組
int *p = new int[10];
,此時(shí)會(huì)得到一個(gè)元素類(lèi)型的指針(動(dòng)態(tài)數(shù)組并不是數(shù)組類(lèi)型),由于分配的內(nèi)存并不是一個(gè)數(shù)組類(lèi)型,因此不能對(duì)動(dòng)態(tài)數(shù)組調(diào)用begin或end。new分配的對(duì)象,無(wú)論是單個(gè)分配還是數(shù)組中的都是默認(rèn)初始化的,加上空括號(hào)后變?yōu)橹党跏蓟?code>int *p = new int[10]();,釋放動(dòng)態(tài)數(shù)組:delete [] p;
unique_ptrp(new int[]10);
,可以使用下標(biāo)運(yùn)算符來(lái)訪問(wèn)數(shù)組中的元素。與unique_ptr不同,shared_ptr不直接支持管理動(dòng)態(tài)數(shù)組,如果要使用shared_ptr管理,必須提供自定義的刪除器shared_ptrp(new int[10],[](int *p){delete[] p});
,并且不能使用下標(biāo)運(yùn)算符,只能用gert()獲取內(nèi)置指針后再訪問(wèn)數(shù)組元素allocator
定義在頭文件
中,提供了一種類(lèi)型感知的內(nèi)存分配方法,分配的內(nèi)存是未構(gòu)造的allocatora
:定義一個(gè)可以為類(lèi)型T分配內(nèi)存的allocator對(duì)象;②a.allocator(n)
:分配一段可以保存n個(gè)類(lèi)型為T(mén)的對(duì)象的未構(gòu)造的內(nèi)存;③a.deallocator(p,n)
:釋放從T*指針p開(kāi)始的n個(gè)T類(lèi)型對(duì)象的內(nèi)存,p必須分配過(guò)n個(gè)T類(lèi)型對(duì)象,且已被創(chuàng)建的對(duì)象必須調(diào)用過(guò)destroy;④a.construct(p,args)
:在p指向的未構(gòu)造內(nèi)存中通過(guò)args構(gòu)造一個(gè)對(duì)象;⑤a.destory(p)
:對(duì)p指向的對(duì)象執(zhí)行析構(gòu)函數(shù);⑥uninitialized_copy(b,e,b2)
/uninitialized_copy_n(b,n,b2)
:將迭代器b到e中的元素拷貝到迭代器b2指向的未構(gòu)造內(nèi)存中,b2的內(nèi)存必須足夠大;⑦uninitialized_fill(b,e,t)
/uninitialized_fill_n(b,n,t)
:在迭代器b到e的未構(gòu)造內(nèi)存中放入值為t的拷貝你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
當(dāng)前題目:【C++基礎(chǔ)】2.標(biāo)準(zhǔn)庫(kù)-創(chuàng)新互聯(lián)
鏈接URL:http://m.rwnh.cn/article12/dsdpdc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、做網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、App設(shè)計(jì)、全網(wǎng)營(yíng)銷(xiāo)推廣、手機(jī)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)