optional_hash

optional_hash (std::optional 해시)

이 페이지는 std::optional에 대한 std::hash 템플릿 특수화를 다루고 있어요. 이 특수화를 사용하면 optional 객체에 저장된 값의 해시를 얻을 수 있고, optional을 unordered_set이나 unordered_map의 키로 사용할 수 있게 돼요. 해시는 optional이 값을 포함하지 않을 때도 정의되지만 그 값은 지정되지 않아요.

출처: cppreference

본문

정의

<optional> 헤더에 정의되어 있으며, C++17부터 사용할 수 있어요.

template < class T > struct hash < std :: optional < T >> ;

설명

std::optional 클래스에 대한 std::hash 템플릿 특수화는 사용자가 optional 객체에 포함된 값의 해시를 얻을 수 있게 해줘요.

std::hash < std :: optional < T >> 특수화는 std :: hash < std :: remove_const_t < T >>가 활성화되어 있으면 활성화되고(std::hash 참고), 그렇지 않으면 비활성화돼요.

활성화된 경우, 값을 포함하는 std :: optional < T > 타입의 객체 o에 대해 std::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

같이 보기

  • hash (C++11) - 해시 함수 객체 (클래스 템플릿)

더 알아보기 (Learn more)

cppreference