1. 程式人生 > >C/C++基礎----順序容器

C/C++基礎----順序容器

replace sort tails priority str array 有用 top 超出

通常沒有特別的原因,用vector。

list和forward_list有額外的內存開銷,如果有很多小元素,不要使用。

如果只在讀取輸入時需要在容器中間位置插入元素,隨後需要隨機訪問。

  1確定是否真正需要在中間位置插入,可以用vector再用sort排序;

  2如必須在中間插入元素,可在輸入階段用list,完了之後拷貝到vector

insert與emplace(emplace_back、emplace_front)

emplace是直接將參數傳遞給元素類型的構造函數,在容器管理的內存空間中直接構造元素。

與insert相比,省去了構造臨時對象,減少了內存開銷。

類型別名在泛型編程中很有用。

直接容器拷貝,要求容器類型和元素類型都匹配;

用叠代器拷貝不要求,只要元素類型可以轉換即可。

array,跟內置數組一樣,大小也是類型的一部分。

跟其他容器不同,默認構造的array的元素都是默認初始化,跟數組一樣。

但是array支持拷貝和賦值操作,不過容器類型和大小,元素類型都必須相同。

不允許將花括號列表賦值給array。

assign允許從一個不同但相容的類型賦值

assign操作不適用與array和關聯容器。

swap操作不會對任何元素進行拷貝刪除或插入(除array外),可以在常數時間內完成。

除string外指向容器的叠代器,指針和引用在swap之後都不會失效。仍指向swap操作之前的元素,但是已屬於不同容器了。

對於array,swap會真正交換元素,所需時間與元素數目成正比。但是叠代器指針等也不會失效。

非成員版本swap在泛型編程中很重要。

只有當元素也定義了相應的比較運算符的時候,才可以使用比較運算符來比較兩個容器。

向vector、string、deque插入元素(除首尾),都需要移動元素,甚至可能引起對象存儲空間的重新分配。用叠代器範圍插入時,叠代器不能指向本容器。

訪問元素

在調用front或者back(解引用begin --end)之前,確保非空。

c.front() c.baock() c[n] 都有越界風險 c.at(n)則會拋出out_of_range異常。

forward_list特殊操作

因為單向鏈表沒有簡單的辦法來獲取其前驅,所以是通過操作給定元素後面的元素來完成的。insert_after、emplace_after、erase_after。

還特意定義了首前叠代器lst.before_begin() lst.cbefore_begin()

一般insert/emplace返回第一個添加的元素的叠代器,而after版本指向最後一個插入元素的叠代器。

叠代器失效

添加元素

vector、string:存儲空間重新分配,則全部失效;未重新分配,則插入之前部分的叠代器、引用指針仍有效。

deque:首尾以外的位置,全部失效。首尾添加,叠代器會失效,引用指針不會。

list、forward:仍有效。

刪除元素

list、forward:仍有效。

deque:首尾以外的位置,全部失效。刪除尾元素,尾後叠代器失效;刪除首元素,仍有效

vector、string:被刪之前的部分仍有效。

當使用叠代器(指針、引用),最小化要求叠代器必須有效的程序片段。在循環中更新叠代器。

尾後叠代器總是會失效,不要保存

容量大小

shrink_to_fit() 將分配的空間減小到與size()相同大小,僅適用於vector、string、deque

capacity() 不重新分配內存,可以保存多少元素,僅vector和string

reserve() 分配至少能容納n個元素的內存空間,僅vector和string

resize()是改變容器中元素的數目,不會減少容器預留的內存空間

string額外操作

構造

如果從一個數組構造string,必須以空字符結尾,否則需要指定拷貝前n個字符。

string s(cp, n);;

string s(s1, pos,len),pos超出s1的size會報異常,len不管多大最多拷貝至string結尾。

string除了叠代器版本,還支持下標的操作

insert、erase、append、replace、assign

搜索函數

返回string::size_type無符號類型

將返回值用int來保存不是個好主意。

find(args) //查找s中args第一次出現的位置

rfind(args)倒查 //查找s中args最後一次出現的位置

find_first_of(args) //s中查找args任意一個字符第一次出現的位置

find_last_of(args) //s中查找args任意一個字符最後一次出現的位置

find_first_not_of(args) //s中查找第一個不在args中的字符

find_last_not_of(args) //s中查找最後一個不在args中的字符

args中可以指定開始查找的位置pos,默認為0。這個可以方便連續查找。

數值類型轉換

to_string(val)

stoi(s, p, b)

stol(s, p, b)

stoul(s, p, b)

stoll(s, p, b)

stoull(s, p, b)

stof(s, p, b)

stod(s, p, b)

stold(s, p, b)

p是size_t的指針,用來存放第一個非數值字符的下標,默認為0

b是轉換的基數,默認為10

容器適配器

適配器是一種機制,能使某種事物的行為看起來像另外一種事物。容器、叠代器、函數都有適配器。通用操作empty、size、swap

默認情況下,stack和queue是基於deque,priority_queue是基於vector實現。

stack:只要求push_back pop_back back,除了array和forward_list都可以

queue: 要求back、push_back、front、pop_front,可以構造與list或deque之上

priority_queue:除了front、push_back、pop_back的操作還要求隨機訪問,可以構造於vector或deque。

stack棧操作

s.pop()

s.push(item)

s.emplace(args)

s.top()

queue和priority_queue操作

q.pop() 返回queue首元素或者prio的最高優先級元素

q.front() q.back() 返回首元素或者尾元素,不刪除,只適用於queue

q.top() 返回最高優先級元素,但不刪除

q.push(item) 在queue末尾或者prio中恰當位置創建一個元素或者由args構造一個元素

q.emplace(args)

前綴中綴後綴表達式

http://blog.csdn.net/yuyanggo/article/details/48063473

C/C++基礎----順序容器