首先,我們必須理解一下什麼是容器,在C++ 中容器被定義為:在數據存儲上,有一種對象類型,它可以持有其它對象或指向其它對像的指針,這種對象類型就叫做容器。很簡單,容器就是保存其它對象的對象,當然這是一個樸素的理解,這種“對象”還包含了一系列處理“其它對象”的方法,因為這些方法在程序的設計上會經常被用到,所以容器也體現了一個好處,就是“容器類是一種對特定代碼重用問題的良好的解決方案”。
容器還有另一個特點是容器可以自行擴展。在解決問題時我們常常不知道我們需要存儲多少個對象,也就是說我們不知道應該創建多大的內存空間來保存我們的對象。顯然,數組在這一方面也力不從心。容器的優勢就在這裡,它不需要你預先告訴它你要存儲多少對象,只要你創建一個容器對象,並合理的調用它所提供的方法,所有的處理細節將由容器來自身完成。它可以為你申請內存或釋放內存,並且用最優的算法來執行您的命令。
容器是隨著面向對象語言的誕生而提出的,容器類在面向對象語言中特別重要,甚至它被認為是早期面向對象語言的基礎。在現在幾乎所有的面向對象的語言中也都伴隨著一個容器集,在C++ 中,就是標准模板庫(STL )。
和其它語言不一樣,C++ 中處理容器是采用基於模板的方式。標准C++ 庫中的容器提供了多種數據結構,這些數據結構可以與標准算法一起很好的工作,這為我們的軟件開發提供了良好的支持!
STL 對定義的通用容器分三類:順序性容器、關聯式容器和容器適配器。
順序性容器 是一種各元素之間有順序關系的線性表,是一種線性結構的可序群集。順序性容器中的每個元素均有固定的位置,除非用刪除或插入的操作改變這個位置。這個位置和元素本身無關,而和操作的時間和地點有關,順序性容器不會根據元素的特點排序而是直接保存了元素操作時的邏輯順序。比如我們一次性對一個順序性容器追加三個元素,這三個元素在容器中的相對位置和追加時的邏輯次序是一致的。
關聯式容器 和順序性容器不一樣,關聯式容器是非線性的樹結構,更准確的說是二叉樹結構。各元素之間沒有嚴格的物理上的順序關系,也就是說元素在容器中並沒有保存元素置入容器時的邏輯順序。但是關聯式容器提供了另一種根據元素特點排序的功能,這樣迭代器就能根據元素的特點“順序地”獲取元素。
關聯式容器另一個顯著的特點是它是以鍵值的方式來保存數據,就是說它能把關鍵字和值關聯起來保存,而順序性容器只能保存一種(可以認為它只保存關鍵字,也可以認為它只保存值)。這在下面具體的容器類中可以說明這一點。
容器適配器 是一個比較抽象的概念, C++的解釋是:適配器是使一事物的行為類似於另一事物的行為的一種機制。容器適配器是讓一種已存在的容器類型采用另一種不同的抽象類型的工作方式來實現的一種機制。其實僅是發生了接口轉換。那麼你可以把它理解為容器的容器,它實質還是一個容器,只是他不依賴於具體的標准容器類型,可以理解是容器的模版。或者把它理解為容器的接口,而適配器具體采用哪種容器類型去實現,在定義適配器的時候可以由你決定。
下表列出STL 定義的三類容器所包含的具體容器類:
標准容器類
特點