std::hash
std::hash (std::vector 특수화)
std::hash의 std::vector<bool> 특수화예요. std::vector<bool> 타입 객체의 해시 값을 얻을 수 있게 해줘요. unordered_* 컨테이너에 std::vector<bool>을 넣을 수 있게 해줘요. C++11부터 있어요.
출처: cppreference
본문
<vector> 헤더에 정의돼 있고, std::hash의 std::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 같은 해시 기반 컨테이너의 키나 원소 타입으로 사용할 수 있어요. 해시가 비트 벡터의 내용을 바탕으로 계산되므로 내용이 같은 벡터는 같은 해시를 가져요.