原文位址
順序容器類型
所有順序容器都提供了快速順序通路元素的能力
vector //可變大小數組,支援快速随機通路。但在尾部之外的位置插入 //或删除元素可能會很慢
deque //雙端隊列,支援快速随機通路,在頭尾位置插入/删除速度很快
list //雙向連結清單,隻支援雙向順序通路。在任何位置進行插入/删除速 //度都很快
forward_list
array
string
通常,使用vector是最好的選擇,除非你有很好的理由選擇其他容器
順序容器操作
添加元素
這些操作會改變容器的大小;array不支援這些操作
forward_list有自己專有版本的insert與emplace
forward_list不支援push_back與emplace_back
vector和string不支援push_front和emplace_front
c.push_back(t)
c.emplace_back(args)
c.push_front(t)
c.emplace_front(args)
c.insert(p,t)
c.emplace(p,args)
c.insert(p,n,e)
c.insert(p,b,e)
c.insert(p,il)
tip:向一個vector,string,deque插入元素會使所有指向容器的疊代器、引用和指針失效
關于容器元素這有一個概念, 容器元素是拷貝 —— 即插入容器中的值不是對象本身,對其修改,不會影響任何其他元素或對象
通路元素操作
每個順序容器都有一個front成員函數,而除forward_list之外其餘所有順序容器都有back成員函數
at和下标操作隻适用于string,vector,deque和array
back不适用于forward_list
c.back() //傳回c中尾元素引用,若c為空,則函數行為未定義
c.front() //傳回c中首元素引用,若c為空,則函數行為未定義
c[n]
c.at(n)
删除元素
下列操作會改變容器的大小,是以不适用與array
forward_list有特殊版本的erase
forward_list不支援pop_back
vector,string不支援pop_front
c.pop_back() //删除c中尾元素
c.pop_front() //删除c中首元素
c.erase(p) //删除疊代器中p所指元素,傳回p所指元素的下一個元素
c.erase(b,e) //删除疊代器b和e所指定範圍内元素
c.clear //删除c中所有元素
對于forword_list
lst.before_begin() 傳回指向首元素之前不存在的元素的疊代器,不能解引用
lst.cbefore_begin()
lst.insert_after(p,t) 可從字面上了解,在p後插入t
lst.insert_after(p,n,t)
lst.insert_after(p,b,e)
lst.insert_after(p,il)
emplace_after(p,args)
lst.erase_after(p) 删除p指向的位置之後的元素
lst.erase_after(b,e)
改變容器大小
resize不适用于array
c.resize(n) 調整大小為n,若大于範圍則多出的元素被丢棄
c.resize(n,t) 調整大小為n, 任何新添加的元素都初始化為值t
vector對象是如何增長的
管理容量的成員函數
shrink_to_fit隻是用于vector,string和deque
capacity和reverse隻适用于vector和string
c.shrink_to_fit() //清楚多餘的空間,使capacity與c.size()的大小一樣
c.capacity() //不重新配置設定記憶體空間的話,c可以儲存多少元素
c.reverse(n) //進行重新配置設定至少n個記憶體空間
reserve并不改變容器中的元素數量,它僅影響vector預先配置設定多大的記憶體空間
構造string的方法
string s1 //空串
string s2(s1) //拷貝
string s2=s1
string s3(“value”) //指派
string s3=”value”
string s4(n,’c’) //”cccccc….(n個c)”
string s(cp,n) //cp指向的數組中前n個字元的拷貝
string s(s2,pos2) //從s2的下标pos2開始
string s(s2,pos2,len2) //從s2的下标pos2開始的len2個字元
substr操作
s.substr(pos,n) //傳回一個string包含s從下标pos開始的n個字元
改變string的方法
string支援順序容器的指派運算以及assign,insert,erase操作
容器指派運算assign
assign操作不适用于關聯容器和array
seq.assign(b,e) //将seq内元素替換為疊代器b與e所指範圍中的元素,b e不能指 //向seq
seq.assign(il) //将seq内元素替換為初始化清單il中的元素
seq.assign(n,t) //将seq内元素替換為n個連續的t
insert:
vector,string,deque,list均支援insert成員
forward_list提供了特殊版本的insert成員
slist.insert(iter,”hello”)
svec.insert(svec.begin(),”hello”) //vector
slist.insert(slist.begin(),”hello”) //等價于slist.push_front(“hello”)
svec.insert(svec.end(),10,”hi”); //插入一組元素
//插入範圍元素
如:
vector v={“bb”,”aa”,”hi”};
slist.insert(slist.begin(),v.end()-2,v.end());
//删除
erase
c.erase(p) //删除p所指元素,傳回後一個
c.erase(b,e) //删除 b e 範圍内所有元素傳回最後被删元素的後一個
string除了接受疊代器的版本外,還接受下标的版本
s.insert(s.size(),5,’!’) //在最後增加5個!
s.erase(s.size()-5,5) //删除後5個元素
const char *p=”hello world”
s.assign(p,5) //s為 hello
s.insert(s.size(),p+5) //s為 hello world
string s=”some string”,s2=”some other string”
s.insert(0,s2) //從s[0]之前插入s2
s.insert(0,s2,0,s2.size()) //從s[0]之前插入s2中s2[0]開始的s2.size()個字 //符
append和replace函數
append為追加函數
如 s2=”C++ Primer”
s2.append(” 4th Ed.”)
replace操作是調用erase 和insert的簡寫操作
如
s2.erase(11,3)
s2.insert(11,”5th”);
等價于s2.replace(11,3,”5th”)
順帶的swap
統一使用非成員版本的swap是一個好習慣
vector<string> vec1(10);
vector<string> vec2(24);
swap(vec1,vec2);
交換後vec1有24個元素,vec2有10個元素
swap隻是交換了兩個容器的内部資料結果
string的搜尋操作
操作均分大小寫
s.find(args) //查找s中args第一次出現的位置
s.rfind(args) //查找s中args最後一次出現的位置
s.find_first_of(args) //在s中查找args中任意字元第一次出現的位置
s.find_last_of(args) //在s中查找args中任意字元最後一次出現的位置
s.find_first_not_of(args) //在s中查找第一個不在args中的字元
s.find_last_not_of(args) //在s中查找最後一個不在args中的字元
容器擴充卡
有stack、queue和priority_queue
stack擴充卡接受一個順序容器(除array與forward_list外)并使其操作看起來像一個stack一樣
定義一個擴充卡
每個擴充卡都定義兩個構造函數:預設構造函數建立一個空對象
接受一個容器的構造函數拷貝該容器來初始化擴充卡
如: deq是一個deque
有 stack stk(deq) //将deq拷貝元素到stk
預設情況下,stack和queue是基于deque實作的
priority_queue是在vector之上實作的
stack<string,vector<string>> str_stk;// 在vector上實作的空棧
stack<string,vector<string>> str_stk2(svec)//拷貝svec進行初始化
使用擴充卡是有限制的,擴充卡要求容器具有添加和删除元素和通路尾元素的能力
是以 array與forward_list均不能用于構造擴充卡
stack隻要求push_back,pop_back,back操作
(除array,forward_list外均可)
queue要求back,push_back,front,push_front
(list,deque)
priority除了要求front,push_back,pop_back操作之外還要能随機通路 (deque,vector)
stack
stack類型定義在stack頭檔案中
它所支援的操作
棧預設在deque實作,也可以在list或vector上實作
s.pop() //删除棧頂元素,不傳回元素值
s.push(item) //建立一個新元素壓入棧頂
s.top() //傳回棧頂元素,不彈出棧
s.emplace(args) //構造一個元素壓入棧頂
queue
queue與priority_queue定義在queue頭檔案中
所支援操作如下:
queue預設基于deque實作,priority_queue預設基于vector實作
queue也可用于list,vector
priority_queue也可用于deque
q.pop() //傳回queue的首元素或priority_queue的最高優先級元素,但 //不删除此元素
q.front() //傳回首元素或尾元素
q.back() //隻适用于queue
q.top() //隻适用于priority_queue,傳回最高優先級元素,但不删除
q.push(item) //在queue末尾或priority_queue中恰當的位置建立一個元 //素,值為item,,,
q.emplace(args) //構造一個元素
标準庫queue使用一種先進先出的存儲和通路政策,進入的對象放置到隊尾,離開的對象從隊首删除
priority_queue允許我們為隊列裡的元素建立優先級,新增元素會排在比它優先級低的元素前