天天看點

關于順序容器的相關内容

原文位址

順序容器類型

所有順序容器都提供了快速順序通路元素的能力

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允許我們為隊列裡的元素建立優先級,新增元素會排在比它優先級低的元素前

以上均為C++Primer的相關内容

原文位址

繼續閱讀