新標準定義了 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...