標籤:.net append 簡單的 blog 刪除元素 適用於 article for 部分
通常沒有特別的原因,用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插入元素(除首尾),都需要移動元素,甚至可能引起Object Storage Service空間的重新分配。用迭代器範圍插入時,迭代器不能指向本容器。
訪問元素
在調用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,必須以Null 字元結尾,否則需要指定拷貝前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++基礎----順序容器