STL 無序容器

2021-10-01 10:36:56 字數 4276 閱讀 2611

新標準定義了 4個無序關聯容器。這些容器不是使用比較運算子來組織元素,而是使用乙個雜湊函式和關鍵字型別的 ==運算子。在元素沒有明顯的序關係的情況下,無序容器是非常有用的。

#include

#include

using

namespace std;

intmain()

,,};

for(

auto

& i : unor_map)

return0;

}

結果為:

520 huameng

25 huameng

發現這個容器的關鍵字不可重複
無序容器在儲存上組織為一組桶,每個桶儲存零個或多個元素。無序容器使用乙個雜湊函式將元素對映到桶為了訪問乙個元素,容器首先計算元素的雜湊值,它指出應該搜尋哪個桶容器將具有乙個特定雜湊值的所有元素都儲存在相同的桶中。如果容器允許重複關鍵字,所有具有相同關鍵字的元素也都會在同乙個桶中。因此 ,無序容器的效能依賴於雜湊函式的質量和桶的數量和大小

桶介面

c.bucket_count()

正在使用的桶的數目

c.max_bucket_count()

容器能容納的最多的桶的數量

c.bucket_size(n)

第n個桶中有多少個元素

c.bucket(k)

關鍵字為 k的元素在哪個桶中

桶迭代local_iterator

可以用來訪問桶中元素的迭代器型別

const_local_iterator

桶迭代器的 const版本

c.begin(n), c.end(n)

桶n的首元素迭代器和尾後迭代器

c.cbegin(n), c.cend(n)

與前兩個函式類似,但返回 const_local_iterator

雜湊策略

c.load_factor

每個桶的平均元素數量,返回 float值

c.max_load_factor

c 試圖維護的平均桶大小,返回 float值。 c 會在需要時新增新的桶,以使得 load_factor <= max_load_factor

c.rehash(n)

重組儲存,使得 bucket_count >= n,且 bucket_count > size / max_load_factor

c.reserve(n)

重組儲存,使得 c可以儲存 n個元素且不必 rehash

下面列出乙個簡單的例子:

#include

#include

#include

using

namespace std;

intmain()

cout << unmap.

bucket_count()

<< endl;

// 目前桶的數目

cout << unmap.

max_bucket_count()

<< endl;

// 桶的最大數目

cout << unmap.

bucket

("hua"

)<< endl << endl;

// 該鍵對應的值有幾個

}

當我們輸入一串字元後,演示結果為:

hua meng is yi ge hua xin de ren

is occurs 1time

hua occurs 2times

meng occurs 1time

yi occurs 1time

ge occurs 1time

de occurs 1time

8536870911

5

下面我們將演示無序容器的幾種單獨的操作:

pss = pair

;// c++新標準 取別名

intmain()

;// 定義乙個pair物件

string s =

"abc"

;

u_map[s]++;

// 使用下標插入

u_map.

insert

(p1)

;// 使用 insert函式插入乙個pair

u_map.

insert(,

});// 插入乙個初始化列舉

vector vp,}

; u_map.

insert

(vp.

begin()

, vp.

end())

;// 插入乙個迭代器確定的範圍

for(

const

auto

& x : u_map)

}

結果為:

ttt 3

abc 1

efg 2

www 2

wqwe 3

wrrr 2

int

main()

,,,}

; u_map.

insert

(vp.

begin()

, vp.

end())

; u_map.

erase

("www");

// 直接按照 key值刪除

for(

const

auto

& x : u_map)

return0;

}

結果為:

wrrr 2

ttt 3

qq 10

int

main()

,,,}

; u_map.

insert

(up.

begin()

, vp.

end())

;auto it = u_map.

find

("qq");

// 找到qq對應的迭代器

if(it != u_map.

end())

return0;

}

結果為:

qq 10
int

main()

,,,}

; u_map.

insert

(up.

begin()

, up.

end())

;for

(auto i =

0; i < u_map.

bucket_count()

; i++)}

return0;

}

結果為:

bucket:

0 wrrr 2

bucket:

3 ttt 3

bucket:

4 www 3

bucket:

7 qq 10

int

main()

,,,}

; u_map.

insert

(up.

begin()

, up.

end())

; string_int_map::hasher fn = u_map.

hash_fuction()

;// 返回雜湊值的函式

for(

auto it = u_map.

begin()

; it != u_map.

end(

); it++

)return0;

}

結果為:

wrrr的雜湊值是:

2214938872

ttt的雜湊值是:

2771066003

www的雜湊值是:

313303468

qq的雜湊值是:

1548496087

STL無序容器

unordered map和unordered set的實現方式為雜湊函式,所以無序關聯容器不會根據key值對儲存的元素進行排序。include using namespace std typedef pair pss int main string s abc u map s 使用下標插入 u m...

11 4 無序容器

目錄共有四種無序容器 unorder set unorder map unorder multiset unorder multimap 有序容器用比較運算子組織元素 無序容器用hash函式和關鍵字型別的 組織元素 何時使用 如果關鍵字本身是無序的,且發現問題可以轉換為用hash技術解決,就應該採用...

C 容器(STL容器)

容器 container 用於存放資料的類模板。可變長陣列 鍊錶 平衡二叉樹等資料結構在stl中都被實現為容器。在使用容器時,即將容器類模型例項化為容器類,會指明容器中存放的元素是什麼型別。容器可以分為兩大類 順序容器和關聯容器 順序容器有可變長動態陣列vector 雙端佇列deque 雙向鍊錶li...