@@ -954,7 +954,7 @@ int main()
954954```
955955
956956
957- ### 非順序連想コンテナのルックアップ操作で、` key_type ` と比較可能な型を変換せずに使えるように [ (P0919R3)] ( http://wg21.link/P0919r3 )
957+ ### 非順序連想コンテナのルックアップ操作で、` key_type ` と比較可能な型を変換せずに使えるように [ (P0919R3)] ( http://wg21.link/P0919r3 ) , [ (P1690R1) ] ( http://wg21.link/P1690R1 )
958958C++17 までの ` unorderd_map ` や ` unordered_set ` など非順序連想コンテナでは、` find() ` , ` count() ` , ` equal_range() ` などルックアップを行うメンバ関数は引数に ` key_type ` をとり、例えば次のようなケースで ` std::string ` 型の一時オブジェクトが作成されて非効率でした。
959959
960960``` C++
@@ -969,17 +969,24 @@ int main()
969969}
970970```
971971
972- C++20 では、非順序連想コンテナのテンプレートパラメータ ` Hash ` が ` transparent_key_equal ` タグを持つときに 、` key_type ` 以外の型を引数にとるメンバ関数テンプレートのオーバーロードが使用可能になり、一時オブジェクトの作成を回避できるようになります。
972+ C++20 では、非順序連想コンテナのテンプレートパラメータについて ` Hash::is_transparent ` と ` Pred::is_transparent ` が存在するときに 、` key_type ` 以外の型を引数にとるメンバ関数テンプレートのオーバーロードが使用可能になり、一時オブジェクトの作成を回避できるようになります。
973973
974974``` C++
975975#include < string>
976976#include < string_view>
977977#include < unordered_map>
978978
979+ struct string_compare
980+ {
981+ using is_transparent = void;
982+ bool operator()(std::string_view key, std::string_view txt) const { return key == txt; }
983+ };
984+
979985struct string_hash
980986{
981- using transparent_key_equal = std::equal_to<>; // KeyEqual to use
982- using hash_type = std::hash<std::string_view>; // helper local type
987+ using is_transparent = void;
988+ using transparent_key_equal = string_compare;
989+ using hash_type = std::hash<std::string_view>; // helper local type
983990 size_t operator()(std::string_view txt) const { return hash_type{}(txt); }
984991 size_t operator()(const std::string& txt) const { return hash_type{}(txt); }
985992 size_t operator()(const char* txt) const { return hash_type{}(txt); }
@@ -989,7 +996,7 @@ int main()
989996{
990997 using namespace std::literals;
991998
992- std::unordered_map<std::string, int, string_hash> table = { /* ... */ };
999+ std::unordered_map<std::string, int, string_hash, string_compare > table = { /* ... */ };
9931000
9941001 auto it1 = table.find("abc"); // std::string 型の一時オブジェクトは作成されない
9951002
0 commit comments