c 順序容器

2021-08-25 05:32:56 字數 1555 閱讀 8990

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是雙向鍊...