1. 幾種順序容器的比較
容器本質
特點適用範圍
vector
可變大小陣列
連續儲存,快速隨機訪問,除尾部插入刪除慢
預設使用
deque
雙端佇列
快速隨機訪問,除首尾插入刪除慢
兩端都需要新增刪除元素
list
雙向鍊錶
不支援隨機訪問(只能遍歷),插入刪除迅速,額外記憶體開銷大
需要中間插入元素
forward_list
單向鍊錶
同list,只支援單向順序訪問
同上array
固定大小陣列
與內建陣列類似,更安全易用
固定大小陣列
string
類vector,儲存字元
連續存字元
選用vector/deque還是list/forward_list取決於訪問操作和插入/刪除操作的相對比例。
訪問更頻繁,選用vector/deque。若插入/刪除頻繁,選用list/forward_list。
小技巧:如果必須在中間位置插入元素,之後大都為訪問操作,可以在輸入階段使用list,輸入完成拷貝到vector。
2. vector、string物件的儲存
為支援快速隨機訪問,vector將元素連續儲存。若每次儲存都申請一次記憶體分配,每刪除乙個元素進行記憶體釋放,會大大降低程式的執行效能。所以vector和string的實現通常會分配比需求更大的空間,容器預留這些空間作為備用,這樣就不需要每次新增新元素都重新分配記憶體了。
當然,這樣做也有缺點,即每次重新分配記憶體時都要移動所有的元素。但使用這種策略,使得擴張操作通常比list和deque還要快。
為此,容器大小管理操作裡只有vector和string有c.capacity(),與其他容器共通的為c.size()。
c.capacity()含義為分配的空間大小(即不分配新記憶體空間前最多能儲存的元素大小)。
c.size()含義為實際已經儲存元素的數量。所以有c.capacity() >= c.size()。
3. 容器操作可能導致迭代器失效
向容器中新增或刪除元素可能會使指向容器元素的指標、引用或迭代器失效。
新增或刪除元素:
對於vector和string,插入或刪除位置之後元素的指標、引用和迭代器都失效,之前的仍有效。若需要重新分配記憶體,指向容器的指標、引用和迭代器將全部失效。
對queue,插入或刪除除首尾的任何位置都會使指標、引用和迭代器失效。
對兩list,沒影響。
為避免失效引起的問題,可使用insert或erase這種返回迭代器的操作更新迭代器。
不應在迴圈前儲存end()返回的迭代器,必須每次插入操作後重新呼叫end()。
錯誤示例:
auto begin = v.begin()
end = v.end();
while (begin != end)
正確示例:
while (begin != v.end())//重新計算end
C 順序容器
一 順序容器型別 順序容器 vector list deque 介面卡 stack queue priority queue 使用這些容器都必須使用相應的標頭檔案 二 容器元素初始化 cc 建立乙個名為c的空容器 cc c2 建立容器c2的副本 cc b,e 建立c,其元素是迭代器b和e的範圍內的副...
C 順序容器
1 概述 乙個容器就是一些特定型別物件的集合。順序容器型別 描述vector 可變大小陣列,支援快速訪問,在尾部之外的地方插入或刪除時可能很慢 deque 雙端佇列。支援快速訪問,在頭尾插入刪除會很快。list 雙向列表。只支援雙向順序訪問。插入刪除很快 forward list 單向列表。只支援單...
C 順序容器
一 各個順序容器效能差異主要體現在一下兩個方面 1.在容器中任意位置新增和刪除元素的代價 2.隨機訪問容器中元素的代價 vector list deque forward list array string vector是可變大小陣列,支援快速隨機訪問,在尾部插入和刪除元素較為方便 list是雙向鍊...