容器的概念
第一,我們需要知道什麼是容器,官方給出的定義往往比較抽象,對於我來說看了也是不明白,不過這裡還是給出官方定義。c++ 官方文件中容器被定義為:在資料儲存上,有一種物件型別,它可以持有其它物件或指向其它對像的指標,這種物件型別就叫做容器。很簡單,容器就是儲存其它物件的內容,也即為資料;即為資料,自然而然也就包含了其對應處理資料的方法,因為這些方法在程式的設計上會經常被用到,所以容器也體現了乙個好處, 就是「容器類是一種對特定**重用問題的良好的解決方案」。
容器還有另乙個特點就是可以擴充套件。一般我們在建立乙個某種型別資料的容器的時候,不會給這個容器定義需要的空間大小,這個時候容器會預設先分配乙個大小合適的空間,等到程式執行的時候由放入到容器中的資料決定。當資料儲存到分配的空間不夠的時候,系統自動再申請一塊更大的空間,然後把之前的空間內的資料複製到新的空間,再把之前舊的空間給釋放掉。這個過程顯然給程式設計帶來了極大的便利。不過,乙個合格的程式設計師應盡量在建立容器的時候給出空間大小。
容器是隨著物件導向語言的誕生而提出的,容器類在物件導向語言中特別重要,甚至它被認為是早期物件導向語言的基礎。在現在幾乎所有的物件導向的語言中也都伴隨著乙個容器集,在c++ 中,就是標準模板庫(stl )。
和其它語言不一樣,c++ 中處理容器是採用基於模板的方式,基於模板的好處就是你在建立乙個容器時,可以存放自定義型別,比如:自定義類,結構體等。標準c++ 庫中的容器提供了多種基本資料結構,這些資料結構可以與標準演算法一起很好的工作,這為我們的軟體開發提供了良好的支援!
容器的分類
stl定義的容器主要分為兩類:序列式容器、關聯式容器。
序列式容器是 一種各元素之間有順序關係的線性表,是一種線性結構的可序群集。序列式容器中的每個元素均有固定的位置,除非用刪除或插入的操作改變這個位置。這個位置和 元素本身無關,而和操作的時間和地點有關,順序性容器不會根據元素的特點排序而是直接儲存了元素操作時的邏輯順序。比如我們一次性對乙個順序性容器追加三 個元素,這三個元素在容器中的相對位置和追加時的邏輯次序是一致的。
關聯式容器和 序列式容器不一樣,關聯式容器是非線性的樹結構,更準確的說是二叉樹結構。各元素之間沒有嚴格的物理上的順序關係,也就是說元素在容器中並沒有儲存元素置 入容器時的邏輯順序。但是關聯式容器提供了另一種根據元素特點排序的功能,這樣迭代器就能根據元素的特點「順序地」獲取元素;這種容器通常用於對插入的資料有自動排序之類的需要。另外,關聯式容器一般都配合仿函式來使用,仿函式可以看作是乙個函式,這個函式定義了容器插入資料的位置關係。
標準容器類
特點
序列式容器
vector
從後面快速的插入與刪除,直接訪問任何元素
deque
從前面或後面快速的插入與刪除,直接訪問任何元素
list
雙鏈表,從任何地方快速插入與刪除
關聯式容器
set快速查詢,不允許重複值
multiset
快速查詢,允許重複值
map一對多對映,基於關鍵字快速查詢,不允許重複值
multimap
一對多對映,基於關鍵字快速查詢,允許重複值
1.vector容器
vectorv;//建立int型容器
v.push_back(10);//在容器中插入int資料
v.push_back(20);
v.push_back(30);
int val = v[1];//以下標的方式訪問指定內容
//迭代器的方式遍歷容器內的資料
for (vector::iterator it = v.begin();it != v.end();it++)
2.deque容器
dequed;//容器的建立
d.push_back(10);//尾部插入
d.push_front(20);//首部插入
int count = d.size();//獲取容器的目前容量
//deque容器的遍歷
for (deque::iterator it = d.begin(); it != d.end(); it++)
3.list容器
listl1;//容器的建立
l1.push_back(10);//尾部插入
l1.push_front(20);//首部插入
int count = l1.size();//獲取容器的目前容量
//list容器的遍歷
for (list::iterator it = l1.begin(); it != l1.end(); it++)
4.set容器
sets;//建立容器
s.insert(10);//插入元素
s.insert(20);
s.insert(30);
s.insert(10);
int count = s.size();//獲取大小
//list容器的遍歷
for (set::iterator it = s.begin(); it != s.end(); it++)
cout << endl;
從上圖中看到10這個元素插入了兩次,列印輸出的時候,只有乙個10,如下圖:
5.map容器
mapm;//map容器的建立
m.insert(pair(1, 10));//元素插入
m.insert(pair(2, 20));
m.insert(pair(3, 30));
m.insert(pair(4, 40));
int count = m.size();//獲取大小
//list容器的遍歷
for (map::iterator it = m.begin(); it != m.end(); it++)
6.stack容器
stackst;//stack容器的建立
st.push(10);//入棧
st.push(20);
st.push(30);
int count = st.size();//棧容量
while (!st.empty())//判斷棧是否為空
以上是c++中常用的幾種容器,其自帶的基本方法在大多數開發中用的是最多的。這幾種容器的使用方法都差不多,區別在於對插入資料的處理不同,各有個的優點,在程式開發中選擇合適的容器往往會事半功倍。 C 各種容器特點總結
1 vector 內部資料結構 陣列。隨機訪問每個元素,所需要的時間為常量。在末尾增加或刪除元素所需時間與元素數目無關,在中間或開頭增加或刪除元素所需時間隨元素數目呈線性變化。可動態增加或減少元素,記憶體管理自動完成,但程式設計師可以使用reserve 成員函式來管理記憶體。vector的迭代器在記...
C 各種容器特點總結 容器的選擇問題
1 vector 內部資料結構 陣列。隨機訪問每個元素,所需要的時間為常量。在末尾增加或刪除元素所需時間與元素數目無關,在中間或開頭增加或刪除元素所需時間隨元素數目呈線性變化。可動態增加或減少元素,記憶體管理自動完成,但程式設計師可以使用reserve 成員函式來管理記憶體。vector的迭代器在記...
C 中各種容器特點總結
分為順序容器和關聯容器。順序容器包括 1 vector 內部資料結構 陣列,可隨機訪問元素,在末尾增加或刪除元素與元素數目無關,在其 他部分增加或刪除元素隨著元素數目呈線性變化。可通過reserve提前分配足夠的記憶體。2 deque 雙端佇列,按頁 塊來分配儲存,每頁 塊包含固定的數目的元素。支援...