Skip to content

Commit

Permalink
functional/hash: 透過的ハッシュ/等値比較の例示コードを改善
Browse files Browse the repository at this point in the history
C++20標準の`std::equal_to<std::string>`や`std::hash<std::string>`は、
透過的な計算動作を示すメンバ型`is_transparent`を持つことはない。
独自の文字列ハッシュ計算クラスと`std::equal_to<>`に置き換える。
  • Loading branch information
yohhoy committed Feb 17, 2023
1 parent ba05560 commit 5415e29
Showing 1 changed file with 11 additions and 2 deletions.
13 changes: 11 additions & 2 deletions reference/functional/hash.md
Expand Up @@ -123,16 +123,25 @@ int main()
#include <iostream>
#include <unordered_map>
#include <string>
#include <string_view>

struct string_hash {
using is_transparent = void;
// string/string_view/const char*共用ハッシュ計算
size_t operator()(std::string_view sv) const {
return std::hash<std::string_view>{}(sv);
}
};

int main()
{
std::unordered_map<std::string, int> um = {
std::unordered_map<std::string, int, string_hash, std::equal_to<>> um = {
{"Alice", 3},
{"Bob", 1},
{"Carol", 4}
};

// std::equal_to<std::string>とstd::hash<std::string>がis_transparent型を持つ場合
// string_hashおよびstd::equal_to<>はいずれもメンバ型にis_transparentを持つため
// find()などの検索関数に引数を渡す場合に、std::string一時オブジェクトが作られない
auto it = um.find("Alice");
if (it != um.end()) {
Expand Down

0 comments on commit 5415e29

Please sign in to comment.