basic_string_view_hash
basic_string_view_hash (basic_string_view 해시)
이 페이지는 C++ 표준 라이브러리의 std::hash 템플릿 특수화가 std::string_view 계열 타입에 대해 어떻게 동작하는지 설명해요. 이 특수화들은 문자열 뷰를 해시 가능한 객체로 만들어 주며, std::unordered_set이나 std::unordered_map 같은 해시 기반 컨테이너에서 문자열 뷰를 사용할 수 있게 해줘요. 또한 이 해시 값은 대응하는 std::basic_string 타입의 해시 값과 동일해요.
출처: cppreference
본문
정의
<string_view> 헤더에 다음과 같은 std::hash 특수화가 정의돼 있어요.
<string_view> 헤더에 정의됨 |
||
|---|---|---|
template <> struct hash<std::string_view>; |
(C++17부터) | |
template <> struct hash<std::wstring_view>; |
(C++17부터) | |
template <> struct hash<std::u8string_view>; |
(C++20부터) | |
template <> struct hash<std::u16string_view>; |
(C++17부터) | |
template <> struct hash<std::u32string_view>; |
(C++17부터) |
이 특수화들은 문자열 뷰를 해싱하기 위한 다양한 뷰 클래스에 대해 제공돼요.
이 해시들은 대응하는 std::basic_string 클래스들의 해시와 같아요. 만약 S가 표준 basic_string 타입 중 하나이고, SV가 그에 대응하는 문자열 뷰 타입이며, s가 S 타입의 객체라면, std::hash<S>()(s) == std::hash<SV>()(SV(s))가 성립해요.
예제
#include <iostream>
#include <string_view>
#include <unordered_set>
using namespace std::literals;
int main()
{
std::cout << "\"A\" #: " << std::hash<std::string_view>{}("A"sv) << '\n';
std::cout << "L\"B\" #: " << std::hash<std::wstring_view>{}(L"B"sv) << '\n';
std::cout << "u8\"C\" #: " << std::hash<std::u8string_view>{}(u8"C"sv) << '\n';
std::cout << "u\"D\" #: " << std::hash<std::u16string_view>{}(u"D"sv) << '\n';
std::cout << "U\"E\" #: " << std::hash<std::u32string_view>{}(U"E"sv) << '\n';
// std::hash for string_view family makes it possible to keep these view-types
// in unordered_* associative containers, such as unordered_set. But ensure
// the lifespan of referenced strings is no less than lifespan of the container,
// i.e. no dangling references occurred.
std::unordered_set stars{"Rigel"sv, "Capella"sv, "Vega"sv, "Arcturus"sv};
for (std::string_view const& s : stars)
std::cout << s << ' ';
std::cout << '\n';
}
가능한 출력:
"A" #: 6919333181322027406
L"B" #: 11959850520494268278
u8"C" #: 12432341034569643010
u"D" #: 312659256970442235
U"E" #: 18073225910249204957
Arcturus Vega Capella Rigel
같이 보기
| hash (C++11) | 해시 함수 객체 (클래스 템플릿) [편집] |
|---|---|
| std::hashstd::basic_string (C++11) | 문자열에 대한 해시 지원 (클래스 템플릿 특수화) [편집] |