std::unordered_set
| 定義於標頭檔 <unordered_set> |
||
| template< class Key, |
(1) | (C++11 起) |
| namespace pmr { template< |
(2) | (自 C++17 起) |
std::unordered_set 是一種關聯容器,包含一組型別為 Key 的唯一物件。搜尋、插入和移除操作具有平均常數時間複雜度。
在內部,元素不會以任何特定順序排序,而是組織成桶(buckets)。元素被放置到哪個桶中完全取決於其值的雜湊值(hash)。這允許對單個元素進行快速存取,因為一旦計算出雜湊值,它就直接指向元素所在的桶。
容器元素不可修改(即使透過非 const 迭代器也不行),因為修改可能會改變元素的雜湊值並導致容器損毀。
std::unordered_set 符合 Container、AllocatorAwareContainer 以及 UnorderedAssociativeContainer 的要求。
|
|
(C++26 起) |
目錄 |
[編輯] 迭代器失效
| 作業 (Operations) | 失效情況 |
|---|---|
| 所有唯讀操作、swap、std::swap | 從不失效 |
| clear、rehash、reserve、operator= | 總是失效 |
| insert、emplace、emplace_hint | 僅在導致 rehash 時失效 |
| erase | 僅被刪除的元素失效 |
[編輯] 註解
- swap 函式不會使容器內的任何迭代器失效,但它們會使標示交換區域結束的迭代器失效。
- 對容器內資料的參考與指標僅在刪除該元素時才會失效,即使對應的迭代器已經失效。
- 在容器移動賦值後,除非因分配器不相容而強制執行逐元素移動賦值,否則指向被移動容器的參考、指標和迭代器(除了尾後迭代器)仍然有效,但會指向目前位於 *this 中的元素。
[編輯] 樣板參數
| 本節尚不完整 原因:新增範本參數的描述。 |
[編輯] 成員型別
| 類型 | 定義 |
key_type
|
Key |
value_type
|
Key |
size_type
|
無號整數型別(通常為 std::size_t) |
difference_type
|
有號整數型別(通常為 std::ptrdiff_t) |
hasher
|
Hash |
key_equal
|
KeyEqual |
allocator_type
|
Allocator |
reference
|
value_type& |
const_reference
|
const value_type& |
pointer
|
std::allocator_traits<Allocator>::pointer |
const_pointer
|
std::allocator_traits<Allocator>::const_pointer |
iterator
|
指向 value_type 的常數 LegacyForwardIterator 以及 ConstexprIterator(自 C++26 起) |
const_iterator
|
LegacyForwardIterator 與 ConstexprIterator(自 C++26) 至 const value_type |
local_iterator
|
一種迭代器類型,其類別、值、差異、指標和 參考類型與 iterator 相同。此迭代器可用於遍歷單個桶,但不能跨桶遍歷 |
const_local_iterator
|
一種迭代器類型,其類別、值、差異、指標和 參考類型與 const_iterator 相同。此迭代器可用於遍歷單個桶,但不能跨桶遍歷 |
node_type (C++17 起) |
代表容器節點的 節點控制代碼 (node handle) 特化版本 |
insert_return_type (C++17 起) |
描述插入 node_type 結果的型別,為下列型別的特化:template<class Iter, class NodeType> |
[編輯] 成員函式
建構 unordered_set(公開成員函式) | |
解構 unordered_set(公開成員函式) | |
| 指派值給容器 (公開成員函式) | |
| 回傳關聯的配置器 (公開成員函式) | |
迭代器 | |
| 回傳指向起點的反覆器 (公開成員函式) | |
| 回傳指向終點的反覆器 (公開成員函式) | |
容量 | |
| 檢查容器是否為空 (公開成員函式) | |
| 回傳元素個數 (公開成員函式) | |
| 回傳最大可能的元素個數 (公開成員函式) | |
修改器 | |
| 清除內容 (公開成員函式) | |
| 插入元素 或節點(C++17 起) (公開成員函式) | |
| (C++23) |
插入數值範圍元素 (公開成員函式) |
| 原地建構元素 (公開成員函式) | |
| 使用提示(hint)原地建構元素 (公開成員函式) | |
| 刪除元素 (公開成員函式) | |
| 交換內容 (公開成員函式) | |
| (C++17) |
從容器中提取節點 (公開成員函式) |
| (C++17) |
從另一個容器接合(splice)節點 (公開成員函式) |
查找 | |
| 回傳符合指定鍵的元素數量 (公開成員函式) | |
| 尋找具有指定鍵的元素 (公開成員函式) | |
| (C++20) |
檢查容器是否包含具有指定鍵的元素 (公開成員函式) |
| 回傳與特定鍵相匹配的元素範圍 (公開成員函式) | |
Bucket 介面 | |
| 返回指向指定桶開頭的迭代器 (公開成員函式) | |
| 返回指向指定桶結尾的迭代器 (公開成員函式) | |
| 返回桶的數量 (公開成員函式) | |
| 返回桶的最大數量 (公開成員函式) | |
| 返回特定桶中的元素數量 (公開成員函式) | |
| 返回特定鍵所屬的桶索引 (公開成員函式) | |
雜湊策略 (Hash policy) | |
| 返回每個桶的平均元素數量 (公開成員函式) | |
| 管理每個桶的最大平均元素數量 (公開成員函式) | |
| 預留至少指定數量的桶並重新產生雜湊表 (公開成員函式) | |
| 為至少指定數量的元素預留空間並重新產生雜湊表 (公開成員函式) | |
觀察器 | |
| 返回用於雜湊鍵的函式 (公開成員函式) | |
| 返回用於比較鍵是否相等的函式 (公開成員函式) | |
[編輯] 非成員函式
| (C++11)(C++11)(在 C++20 中移除) |
比較 unordered_set 中的值(函式模板) |
| 特化 std::swap 演算法 (函式範本) | |
| (C++20) |
移除所有符合特定條件的元素 (函式範本) |
推導指引 |
(自 C++17 起) |
[編輯] 註解
成員型別 iterator 與 const_iterator 可能為相同型別的別名。這意味著定義一對使用這兩種型別作為參數型別的函式過載可能會違反單一定義規則 (One Definition Rule)。由於 iterator 可轉換為 const_iterator,因此改用一個以 const_iterator 作為參數型別的函式即可運作。
| 功能測試巨集 | 數值 | 標準 | 功能 |
|---|---|---|---|
__cpp_lib_containers_ranges |
202202L |
(C++23) | 容器的範圍建構與插入 |
__cpp_lib_constexpr_containers |
202502L |
(C++26) | constexpr std::unordered_set |
[編輯] 範例
#include <iostream> #include <unordered_set> void print(const auto& set) { for (const auto& elem : set) std::cout << elem << ' '; std::cout << '\n'; } int main() { std::unordered_set<int> mySet{2, 7, 1, 8, 2, 8}; // creates a set of ints print(mySet); mySet.insert(5); // puts an element 5 in the set print(mySet); if (auto iter = mySet.find(5); iter != mySet.end()) mySet.erase(iter); // removes an element pointed to by iter print(mySet); mySet.erase(7); // removes an element 7 print(mySet); }
可能輸出
8 1 7 2 5 8 1 7 2 8 1 7 2 8 1 2
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯應用於之前的 C++ 標準。
| DR | 應用於 | 出版時的行為 | 正確的行為 |
|---|---|---|---|
| LWG 2050 | C++11 | reference、const_reference、pointer和 const_pointer 的定義基於 allocator_type |
基於 value_type 和std::allocator_traits |
[編輯] 參見
| (C++11) |
鍵的集合,按鍵雜湊 (類別範本) |
| 唯一鍵的集合,按鍵排序 (類別樣板) | |
| (C++23) |
適配容器以提供按鍵排序的唯一鍵集合 (類別樣板) |