六大順序容器
| 名稱 | 功能 | 特點(diǎn)> |
|---|---|---|
| vector | 可變大小數(shù)組 | 支持快速隨機(jī)訪問,除尾部外插入、刪除較慢 |
| deque | 雙端隊(duì)列 | 支持快速隨機(jī)訪問,頭尾外插入刪除較慢 |
| list | 雙向列表 | 支持雙向順序訪問,任何位置插入刪除很快 |
| forward_list | 單項(xiàng)列表 | 支持正向順序訪問,任何位置插入刪除很快 |
| array | 固定大小數(shù)組 | 支持快速隨機(jī)訪問,不能添加刪除 |
| string | 字符串 | 支持快速隨機(jī)訪問,除尾部外插入、刪除較慢 |
| 類型與函數(shù) | 描述 |
|---|---|
| iterator | 迭代器 |
| const_iterator | 只讀迭代器 |
| size_type | 無符號(hào)整型,描述容器大小或迭代器位置差 |
| difference_type | 帶符號(hào)整型 |
| value_type | 元素類型 |
| reference | 元素左值類型,與value_type&相似 |
| const_reference | const左值 |
| C c, C c(c2), C c(b,e) | 構(gòu)造函數(shù) |
| C c{a,b,c,d…} | 構(gòu)造函數(shù) |
| C c(n), C c(n,t) | 構(gòu)造函數(shù),n為個(gè)數(shù),t為初始值 |
| c1=c2, c1={a,b,c,d,…} | 賦值 |
| a.swap(b), swap(a,b) | 交換 |
| c.size() | 元素個(gè)數(shù)(不支持forward_list) |
| c.max_size() | 容器可保存最多元素個(gè)數(shù) |
| c.empty() | 確認(rèn)容器是否為空 |
| c.insert(args) | 插入元素 |
| c.emplace(inits) | 構(gòu)造一個(gè)元素 |
| c.erase(args) | 刪除元素 |
| c.clear() | 清空容器 |
| reverse_iterator | 逆尋址迭代器 |
| const_reverse_iterator | 只讀逆尋址迭代器 |
| c.rbegin(), c.rend(), c.crbegin(), c.crend | 返回逆尋址迭代器 |
對(duì)于C c(b,e)的構(gòu)造方法,C所聲明的容器元素類型,必須與b e的類型相容(不一定一樣,除array)。
比較運(yùn)算符必須要求容器中的元素允許元素運(yùn)算。
迭代器有公共的接口,forward_list不支持自減操作。
對(duì)反向迭代器使用自增,等價(jià)于正向迭代器遞減。
迭代器初始化與拷貝初始化區(qū)別
list<string> ls;vector<const char*> vcc;list<string> ls2(ls);//正確無疑deque<string>ds(ls);//錯(cuò)誤,容器種類不同 vector<string>vs(vcc)//錯(cuò)誤,容器元素類型不同forward_list<string>fs(vcc.begin(),vcc.end());//正確 array支持容器直接拷貝(內(nèi)置數(shù)組當(dāng)然不行),但是類型和長(zhǎng)度必須都一致。不支持assign與列表賦值。賦值與交換
交換兩個(gè)容器的元素通常比拷貝元素快,除array不涉及任何元素拷貝、刪除、插入,故在常數(shù)時(shí)間完成。
賦值會(huì)導(dǎo)致左值容器的迭代器、引用、指針失效,而交換會(huì)導(dǎo)致所有迭代器、引用、指針失效(array,string除外)。
assign
assign(b,e):b和e不能是調(diào)用容器的迭代器。assign(n,t):全部替換,沒有部分替換的方法。交換兩個(gè)array用線性時(shí)間,但是元素值改變的同時(shí)迭代器所表示的位置不變。
添加元素
push_back()
不支持forward_list。本質(zhì)是添加拷貝。返回void。push_front
支持list,forward_list,deque。在最開頭插入元素,返回void。insert
對(duì)push_front不支持不代表對(duì)insert插入開頭不支持。
在迭代器指向元素之前插入,且返回第一個(gè)插入元素的迭代器。
通過將返回值賦值給原迭代器,可實(shí)現(xiàn)在同一位置反復(fù)插入元素。
也有返回void版本的insert方法。
emplace :直接進(jìn)行初始化訪問元素
front:返回首元素的引用,通過*(c.begin())也可得到。
back:返回尾元素的引用,forward_list無,通過*(c.end()-1)也可得到。
at(n):返回下標(biāo)為n的元素的引用。刪除元素
pop_front, pop_back
pop_back不支持forward_list,pop_front不支持vector、string。
分別刪除首元素與尾元素,容器不可為空,返回void。
erase:
刪除單個(gè)或范圍元素,返回被刪除的最后一個(gè)元素之后的迭代器。
刪除單個(gè)尾后迭代器是未定義的,范圍包含尾后迭代器是可以的。
forward_list
特殊原因:作為單向鏈表,無法通過簡(jiǎn)答方法獲得元素的前驅(qū),故通過改變給定元素之后的元素來實(shí)現(xiàn)。insert_after:返回指向最后一個(gè)插入元素的迭代器。
emplace_after(p,args):插入元素args,返回指向插入元素的迭代器。
erase_after(p):刪除p指向位置之后的元素,返回指向被刪除元素之后的迭代器。erase_after(b,e):刪除[b,e)之間的元素,且返回指向被刪除元素之后的迭代器。
在forward_list中,通常會(huì)有兩個(gè)變量,一個(gè)記錄當(dāng)前迭代器,一個(gè)記錄前驅(qū)迭代器。
forward_list<int> fl = {0,1,2,3,4,5,6,7,8,9};auto PRev=fl.before_begin();auto curr=fl.begin();while(curr!=fl.end()){ if (*curr % 2) curr = fl.erase_after(prev); else prev = curr++;}注意點(diǎn):一旦涉及到容器的插入刪除,不要緩存迭代器(end()),應(yīng)當(dāng)每次使用都調(diào)用一次。
shrink_to_fit:將上限減少到與size()相匹配的大小。
vector重新分配內(nèi)存時(shí)一般上限*2。
構(gòu)造方法
(cp,n) cp指向的數(shù)組中的,前n個(gè)元素的拷貝。如果不傳遞n,指針?biāo)赶虻臄?shù)組必須以 ‘/n’ 結(jié)尾!
(s2,pos2) 從string類對(duì)象s2的下標(biāo)pos2開始的拷貝,pos2大于s2.size()為未定義的行為。
(s2,pos2,len2) 從string類對(duì)象s2的下標(biāo)pos2開始len2個(gè)字符的拷貝,pos2大于s2.size()為未定義的行為,len2過長(zhǎng)不影響正常運(yùn)行。
s.substr(pos,n) 返回字符串s從pos到pos+n-1的子串的拷貝。
其他操作
存在基于下標(biāo)運(yùn)算的insert、erase、assign方法。
append(args):類似于”+”。
replace(range,args):range為pos開始len長(zhǎng)個(gè)字符,或者是一對(duì)迭代器。搜索操作
返回值:string::size_type或string::npos。
find(args) 返回調(diào)用對(duì)象中第一個(gè)匹配s的位置的下標(biāo),不存在則返回npos。
rfind(args) 返回調(diào)用對(duì)象中最后一個(gè)匹配s的位置的下標(biāo),不存在則返回npos。find_first_of(args)、find_last_of(args) 返回第一次/最后一次args中任一字符出現(xiàn)的位置。find_first_not_of(args)、find_last_not_of(args) 返回第一次/最后一次不在args中出現(xiàn)的字符位置。樣例:查找數(shù)字字符 #include <iostream>#include <cstring>using namespace std;int main(){ string s="ab2c3d7R4E6"; string sn="0123456789"; string::size_type pos=0; while((pos=s.find_first_of(sn,pos))!=string::npos){ cout<<s[pos]<<endl; pos++; } pos=0; while((pos=s.find_first_not_of(sn,pos))!=string::npos){ cout<<s[pos]<<endl; pos++; } return 0;}compare方法:類似于strcmp。
數(shù)值轉(zhuǎn)換:一般為sto + 類型首字母 + (s,p,b),p為第一個(gè)非數(shù)值字符的下標(biāo),b為基數(shù)默認(rèn)10。 string s="a=1";int i=stoi(s.substr(s.find_first_of(0123456789)));定義:接受一種已有容器,并使其有接收適配器的操作。
定義適配器
與容器定義類似。
默認(rèn)下,stack 和 queue 是基于deque實(shí)現(xiàn)的,而priority_queue是基于vector實(shí)現(xiàn)的。
通過創(chuàng)建適配器時(shí)將命名的順序容器作為第二個(gè)參數(shù),可以重載默認(rèn)容器類型。
stack<string, vector<string>>str_stk(svec);限制
適配器不能構(gòu)造于array、forward_list之上。queue不能構(gòu)造于vector之上,priority_queue不能構(gòu)造于list之上。適配器不可以調(diào)用底層容器專有的方法。特征
queue:先進(jìn)先出,即進(jìn)入隊(duì)列的對(duì)象被放置到對(duì)尾。priority_queue:新加入的元素排在優(yōu)先級(jí)比其低的元素之前。新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注