名稱空間
變體
操作

std::hash<std::optional>

來自 cppreference.com
< cpp‎ | utility‎ | optional
 
 
 
 
定義於標頭檔案 <optional>
template< class T >
struct hash<std::optional<T>>;
(C++17 起)

std::hashstd::optional 類的模板特化允許使用者獲取 optional 物件中包含的值的雜湊值。

如果 std::hash<std::remove_const_t<T>> 已啟用,則 std::hash<std::optional<T>> 的特化將啟用(參見 std::hash),否則停用。

當啟用時,對於型別為 std::optional<T> 且包含值的物件 ostd::hash<std::optional<T>>()(o) 的計算結果與 std::hash<std::remove_const_t<T>>()(*o) 的計算結果相同。對於不包含值的 optional 物件,雜湊值未指定。

此特化的成員函式不保證是 `noexcept`,因為底層型別的雜湊可能丟擲異常。

[編輯] 模板引數

T - optional 物件中包含的值的型別

[編輯] 示例

#include <iostream>
#include <optional>
#include <string>
#include <unordered_set>
 
using namespace std::literals;
 
int main()
{
    using OptStr = std::optional<std::string>;
 
    // hash<optional> makes it possible to use unordered_set
    std::unordered_set<OptStr> s =
    {
        "ABC"s, "abc"s, std::nullopt, "def"s
    };
 
    for (const auto& o : s)
        std::cout << o.value_or("(null)") << '\t' << std::hash<OptStr>{}(o) << '\n';
}

可能的輸出

def     11697390762615875584
(null)  18446744073709548283
abc     3663726644998027833
ABC     11746482041453314842

[編輯] 參閱

(C++11)
雜湊函式物件
(類模板) [編輯]