各種容器解析

2021-09-01 04:02:39 字數 1748 閱讀 5802

1  容器分為兩種:collection和map

2 各自旗下的子類關係:

collection:

---- list:是乙個介面,實現類有arraylist/linkedlist/vector.

特點:將以特定次序放入元素,取出來的可能和放進去的順序不同。可以有重複元素。

---- set:是乙個介面,實現類有:hashset/treeset.

特點:不能有重複元素,用它的迭代器來遍歷元素。

用法:-----arraylist最長用,查詢效率高。可以理解為以陣列形式儲存。linkedlist,可以理解為時以鍊錶形式儲存,插入刪除效率高,查詢效率低。雖然它也有get(int index)方法來得到元素,但內部是按照鍊錶連線順序來查詢滴,因此get()的效率不高。vector總是比arraylist慢,很少使用。

-----hashset:實際上是乙個 hashmap 例項,從原始碼看出內部例項化的是乙個hashmap.它不保證 set 的迭代順序;特別是它不保證該順序恆久不變。此類允許使用 null 元素。 可以得到它的迭代器遍歷元素。treeset:能夠維護其內部元素的排序狀態。通常只有當需要產生乙個經過排序的序列才用treeset,它的查詢刪除效率都比hashset低。更常用的是hashset.

------treeset:是乙個treemap的例項,保證排序後的順序按公升序排序,或者而按照set提供的比較器排序。

hashset與treeset區別:前者無順序,後者有順序且不能重複。  hashset是基於hash演算法實現的,其效能通常優於treeset,我們通常都應該使用hashset,在我們需要排序的功能時,我門才使用treeset。

map:

-----是乙個介面,實現類有hashmap/treemap/hashtable.

特點:儲存的是乙個鍵值對。「鍵」是獨一無二滴,所對應的「值」可以重複。

用法:---------hashmap:擁有增刪查等基本操作,內部機制為利用物件的hashcode快速找到key.

注:hashmap利用了hash表的資料結構,通過乙個自定的hash函式把關鍵字key轉化為乙個獨一無二的int值,即hash值,用該數值確定該key在array陣列(長度確定,預設為16,不能擴容,不同於arraylist)中的位置,若該位置已經有值,則在位置後面連線乙個鍊錶,用來放有相同hash值的值,即乙個array的值對應多個value.

附錄:hash表結構還可以有別的方法來解決衝突,比如二次線性在雜湊等。詳細略。

---------treemap:該對映根據其鍵的自然順序進行排序,或者根據建立對映時提供的comparator進行排序,具體取決於使用的構造方法。

---------hashtable:hashmap是用來代替hashtable的類,一般現在不用後者。後者不支援null值。hash值的使用不同,hashtable直接使用hashcode得到hash值,**為:

int hash = key.hashcode();

int index = (hash & 0x7fffffff) % tab.length;

hashmap有個hash公式計算hash值,**為

int hash = hash(k);

int i = indexfor(hash, table.length);

static int hash(object x)

static int indexfor(int h, int length)

hashmap用於快速查詢。

STL 各種容器

c stl 的實現 1.vector 底層資料結構為陣列 支援快速隨機訪問 2.list 底層資料結構為雙向鍊錶,支援快速增刪 3.deque 底層資料結構為乙個 控制器和多個緩衝區,詳細見stl原始碼剖析p146,支援首尾 中間不能 快速增刪,也支援隨機訪問 4.stack 底層一般用23實現,封...

總結各種容器特點

1 vector 內部資料結構 陣列。隨機訪問每個元素,所需要的時間為常量。在末尾增加或刪除元素所需時間與元素數目無關,在中間或開頭增加或刪除元素所需時間隨元素數目呈線性變化。可動態增加或減少元素,記憶體管理自動完成,但程式設計師可以使用reserve 成員函式來管理記憶體。vector的迭代器在記...

一 各種容器測試

查詢速度慢 void test vector catch exception p cout size v.size endl cout capcity v.capacity endl cout front v.front endl cout back v.back endl string targe...