1 定義
unordered_set本質是使用hash散列的方式存儲數據,是一種使用hash值作為key的容器,所以當有頻繁的搜索、插入和移除擁有常數時間。unordered_set存儲原理是聲明一個有n個桶的數據結構,計算加入到unordered_set的新的值hash,然后計算hash%n后的值x,將新的值加入到桶x中。當桶x中已經有了元素,就直接鏈接在后邊。當數據結構中的元素滿足一定數量時需要擴充桶的數量,並重新構建桶結構。它具有以下特點:
1、unordered_set是一種容器,它以不特定的順序存儲唯一的元素,並允許根據元素的值快速檢索單個元素。
2、在unordered_set中,元素的值同時是唯一標識它的鍵。鍵是不可變的,只可增刪,不可修改。
3、在內部,unordered_set中的元素沒有按照任何特定的順序排序,而是根據它們的散列值組織成桶(一個線性鏈表代表一個桶),從而允許通過它們的值直接快速訪問單個元素(平均時間復雜度為常數)。
4、unordered_set容器比set容器更快地通過它們的鍵訪問單個元素,盡管它們在元素子集的范圍迭代中通常效率較低。
5、容器中的迭代器只能是正向迭代器。
2 基本的函數
2.1 unordered_set構造
std::unordered_set<std::string> c:初始化容器;
std::unordered_set<std::string> c{ "aaa", "bbb", "ccc" }:初始化容器,並將"aaa", "bbb", "ccc"加入到容器中;
std::unordered_set<std::string> c{ 16 }:初始化容器,並設置16個桶;
2.2 添加新的元素
c.insert("dddd"):向容器添加元素”dddd";
a.insert({ "aaa","bbbb","cccc" }):向容器添加元素"aaa","bbbb","cccc";
a.insert(b.begin(), b.end()):b是一個存儲着和a相同類型元素的向量,可將b中所有元素添加到a中。
2.3 查找元素
a.find("eeee"):查找元素"eeee",返回結果為a.end()則表明沒有找到,否則返回所對應元素;
a.count("eeee"):查找元素"eeee"在a中有幾個(由於unordered_set中沒有相同的元素,所以結果通常為0或1)。
2.4 查找桶接口
a.bucket_count():返回數據結構中桶的數量;
a.bucket_size(i):返回桶i中的大小;
a.bucket(“eeee"):返回元素"eeee"在哪個桶里。
2.5 觀察器
a.hash_function()("aaa"):返回"aaa"所對應的hash值;
a.key_eq()("aaa","aaaa") :當元素相同時返回true,否則返回false。
2.6 清除元素
a.clear():清除a中所有元素;
a.erase("aaa"):清除元素"aaa"。
2.7 統計函數
a.size():返回a中總的元素個數;
a.max_size():返回a中最大容納元素;
a.empty():判斷a中是否為空。