Skip to content

Commit 42d9e18

Browse files
committed
Update cpp20.md
1 parent c3ce8e4 commit 42d9e18

1 file changed

Lines changed: 12 additions & 5 deletions

File tree

docs/standardization/cpp20.md

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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)
958958
C++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+
979985
struct 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

Comments
 (0)