在物件導向程式中,大多引入了容器的概念。那麼什麼是容器?實質上是一組相同型別物件的集合,但它不僅僅是陣列那麼簡單,它實現了比陣列更複雜的資料結構,能夠實現更複雜的功能。c++標準模版庫里提供了10種通用的容器,它基本可以解決程式中遇到的大部分問題。
什麼是容器
c++中容器的定義如下:資料儲存上,有一種物件型別,它可以持有其他物件或指向其他物件的指標,這種物件型別叫容器。通俗的說容器就是儲存其他物件的物件,這種「物件」還包含了一些列處理其他物件的方法,這也體現了容器類的乙個好處,「容器類對特定**重用問題的良好的解決方案」。
容器另乙個好處就是可以自行擴充套件,解決問題是我們不知道需要儲存多少個物件,陣列在這方面是個欠缺。容器可以為你申請記憶體、釋放記憶體,並且使用最優的演算法來執行你的命令。
通用容器的分類
(1)順序性容器:各元素之間有順序關係的線性表,是一種線性關係的有序集群,順序容器中的元素均有固定的位置,除非用刪除和插入來改變它的位置,這個位置和元素本身無關,和操作時間和地點有關。
vector:從後面快速刪除和插入,訪問任一元素;
deque:從前面或後面快速刪除和插入,訪問任一元素;
list:雙聯表,從任何位置插入和刪除;
(2)關聯式容器:非線性的樹結構(二叉樹結構),各元素之間沒有嚴格的物理順序。關聯容器提供了根據元素特點排序的功能,迭代器根據元素特點「順序」的取元素。
set:快速查詢,不允許重複值;
multiset:快速查詢,允許重複值;
map:一對多對映,基於關鍵字快速查詢,不允許重複值;
multimap:一對多對映,基於關鍵字快速查詢,允許重複值;
(3)容器介面卡:讓一種已存在的容器型別採用另一種不同抽象型別的工作方式來實現的一種機制。實質上僅發生了介面轉換。
stack:後進先出;
queue:先進先出;
priority_queue:最高優先順序第乙個出列;
順序性容器
(1)向量vector:我們可以把它看成動態陣列,建立乙個vector後,它會在記憶體中分配一塊連續的區域儲存資料,初試空間可以指定也可以有vector決定(capacity()函式返回值)。當資料儲存空間超過分配空間,vector會重新分配一塊記憶體區域,這樣的分配很耗時,動作如下:
首先,vector申請一塊更大記憶體區域;
然後,將原來的資料拷貝到新的記憶體區域;
其次,銷毀原來記憶體塊資料;
最後,釋放原來記憶體空間。
所以,如果vector儲存的資料量很大,這樣的操作會導致很糟糕的效能。只有在預知空間大小的情況下,vector的效能才是最好的。
(2)雙向鍊錶list:雙向線性鍊錶結構,指標將所有元素鏈結起來。根據其結構特點,list檢索效能不好,需要順序查詢,檢索時間與目標元素位置成正比。但是它可以對快速的刪除和插入。
(3)雙端佇列deque:對序列兩端插入和刪除的容器,可以快速的隨即查詢。它不像vector把所有元素儲存在同一記憶體塊,而是採用多個連續的儲存塊,並且乙個對映結構中儲存對這些塊和元素順序的跟蹤。deque是vector和list優缺點的結合,它是處於兩者之間的一種容器。支援及vector.at(),效能沒有vector好。
關聯容器
set,multiset,map,multimap都是非線性結構的樹結構,採用高效的平衡檢索二叉樹——紅黑樹結構。
(1)set:一組元素的集合,元素值是唯一的,且按一定順序排列,集合中每個元素稱為集合的例項,內部採用鍊錶結構組織;
(2)multiset:多重集合,實現方式類似set,元素值不唯一;
(3)map:提供「鍵–值」一一對應的資料儲存能力,「鍵」在容器中不可重複,且按一定順序排列;
(4)multimap:原理同上,「鍵」在容器中可重複。
關聯容器插入和刪除比vector快,比list要慢,每次插入刪除後需要對元素重現排序;
關聯容器檢索比vector慢,但比list要快得多;
容器介面卡
stl提供的三種介面卡可以由某一種順序容器去實現,預設stack和queue是基於deque容器實現,prioriety_queue是基於vector實現。
c 標準容器介紹與對比
c 中的容器類包括 順序儲存結構 和 關聯儲存結構 前者包括vector,list,deque等 後者包括set,map,multiset,multimap等。若需要儲存的元素數在編譯器間就可以確定,可以使用陣列來儲存,否則,就需要用到容器類了。1 vector 連續儲存結構,每個元素是在記憶體上是...
44 C 基礎 容器介紹
容器分為 順序容器,關聯容器,容器適配類 是一種各個元素之間有順序關係的線性表 verctor 將元素保持在連續的儲存空間 deque list 雙鏈表,從任何地方快速插入與刪除 2.1 vector 相當於陣列,可以通過下標隨機訪問,速度很快。但是在容器的中間位置新增和刪除檔案非常耗時。因為一次插...
c queue容器介紹
一.queue模版類的定義在標頭檔案中。queue與stack模版非常類似,queue模版也需要定義兩個模版引數,乙個是元素型別,乙個是容器型別,元素型別是必要的,容器型別是可選的,預設為dqueue型別。定義queue物件的示例 如下 queueq1 queueq2 queue的基本操作有 1.入...