C/C++基礎----順序容器
通常沒有特別的原因,用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++基礎----順序容器