std::hash

std::hash (std::vector 특수화)

std::hashstd::vector<bool> 특수화예요. std::vector<bool> 타입 객체의 해시 값을 얻을 수 있게 해줘요. unordered_* 컨테이너에 std::vector<bool>을 넣을 수 있게 해줘요. C++11부터 있어요.

출처: cppreference

본문

<vector> 헤더에 정의돼 있고, std::hashstd::vector<bool> 특수화예요.

template< class Allocator >
struct hash<std::vector<bool, Allocator>>;

std::vector<bool>에 대한 std::hash의 템플릿 특수화로, std::vector<bool> 타입 객체의 해시를 얻을 수 있게 해줘요.

예제를 보면요.

#include <iostream>
#include <unordered_set>
#include <vector>

using vb = std::vector<bool>;

vb to_vector_bool(unsigned n)
{
    vb v;
    do
    {
        v.push_back(n & 1);
        n >>= 1;
    }
    while (n);
    return v;
}

int main()
{
    for (auto i{0U}; i != 8; ++i)
    {
        std::cout << std::hex << std::uppercase;
        vb v = to_vector_bool(i);
        std::cout << std::hash<vb>{}(v) << ' ' << std::dec;
        for (const bool e : v) std::cout << e << ' ';
        std::cout << '\n';
    }

    // vector<bool>의 std::hash 덕분에 unordered_* 연관 컨테이너에 넣을 수 있어요
    std::unordered_set v{vb{0}, vb{0, 0}, vb{1}, vb{1, 1}};
}

이 특수화 덕분에 std::vector<bool>std::unordered_set, std::unordered_map 같은 해시 기반 컨테이너의 키나 원소 타입으로 사용할 수 있어요. 해시가 비트 벡터의 내용을 바탕으로 계산되므로 내용이 같은 벡터는 같은 해시를 가져요.

더 알아보기 (Learn more)

cppreference