名前空間
変種
操作

std::hash<std::basic_string>

From cppreference.com
< cpp‎ | string‎ | basic string
 
 
 
std::basic_string
 
ヘッダ <string> で定義
template< class A >
struct hash<std::basic_string<char, std::char_traits<char>, A>>;
(1) (C++11以降)
template< class A >
struct hash<std::basic_string<char16_t, std::char_traits<char16_t>, A>>;
(2) (C++11以降)
template< class A >
struct hash<std::basic_string<char32_t, std::char_traits<char32_t>, A>>;
(3) (C++11以降)
template< class A >
struct hash<std::basic_string<wchar_t, std::char_traits<wchar_t>, A>>;
(4) (C++11以降)
template< class A >
struct hash<std::basic_string<char8_t, std::char_traits<char8_t>, A>>;
(5) (C++20以降)

各種文字列クラスに対するstd::hashのテンプレート特殊化により、ユーザーは文字列のハッシュ値を取得できます。

これらのハッシュ値は、対応するstd::basic_string_viewクラスのハッシュ値と等しくなります。Sがこれらの文字列型のいずれかであり、SVが対応する文字列ビュー型、sS型のオブジェクトである場合、std::hash<S>()(s) == std::hash<SV>()(SV(s))となります。

(C++17以降)

[編集]

以下のコードは、文字列に対して使用されるハッシュ関数の可能な出力例を示しています。

#include <functional>
#include <iostream>
#include <memory_resource>
#include <string>
#include <string_view>
using namespace std::literals;
 
int main()
{
    auto sv = "Stand back! I've got jimmies!"sv;
    std::string s(sv);
    std::pmr::string pmrs(sv); // use default allocator
 
    std::cout << std::hash<std::string_view>{}(sv) << '\n';
    std::cout << std::hash<std::string>{}(s) << '\n';
    std::cout << std::hash<std::pmr::string>{}(pmrs) << '\n';
}

実行結果の例

3544599705012401047
3544599705012401047
3544599705012401047

[編集] 不具合報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 3705 C++11 カスタマイズされたアロケータを持つstd::basic_stringのハッシュサポートが有効になっていませんでした。 有効化されました。

[編集] 関連項目

(C++11)
ハッシュ関数オブジェクト
(クラステンプレート) [編集]
文字列ビューのハッシュサポート
(クラステンプレートの特殊化) [編集]
English 日本語 中文(简体) 中文(繁體)