Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
C++20 射影変換
Search
Akira Takahashi
June 20, 2025
Programming
850
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
C++20 射影変換
Akira Takahashi
June 20, 2025
More Decks by Akira Takahashi
See All by Akira Takahashi
P2P通信の標準化 WebRTCを知ろう
faithandbrave
6
3.2k
C++26アップデート 2025-03
faithandbrave
0
2.2k
C++26 エラー性動作
faithandbrave
2
1.3k
C++20の整数
faithandbrave
0
300
コンテナと文字列の中間インタフェースspanとstring_view
faithandbrave
1
660
C++23 スタックトレースライブラリ
faithandbrave
0
630
if constexpr文はテンプレート世界のラムダ式である
faithandbrave
3
1.6k
使いたい標準C++機能がない環境でいかに実装・設計するか
faithandbrave
2
1.3k
C++20からC++23までの変化
faithandbrave
9
12k
Other Decks in Programming
See All in Programming
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
170
php-fpmのプロセスが枯渇した日-調査・対処・そして本当にやるべきだったこと-
shibuchaaaan
0
290
Go 1.27 における memory allocation の高速化
andpad
0
170
全PRの83%がAIレビューだけでマージできるようになった開発組織はその後どうなったか
athug
1
1.6k
Terraform標準の組織で AWS CDKをどう使うか
mu7889yoon
1
510
Foundation Models frameworkで画像分析
ryodeveloper
1
610
freeeにおけるEvalsの実践例の紹介
freee
PRO
0
110
Cloudflare is Agents
chimame
0
160
AI時代に設計が 最大の生産性レバーになる 意図駆動開発とデータを消さない設計|Don't Delete Your Data or Your Intent — Design as the Deepest Lever in the AI Era
tomohisa
1
850
仕様駆動開発の消費期限
watany
20
8.2k
Built Our Own Background Agent at LayerX
layerx
PRO
10
5.4k
Jindong: Introducing Declarative Haptics in Compose Multiplatform
l2hyunwoo
0
110
Featured
See All Featured
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Designing for Timeless Needs
cassininazir
1
440
sira's awesome portfolio website redesign presentation
elsirapls
0
320
4 Signs Your Business is Dying
shpigford
187
22k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
290
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
200
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
430
Scaling GitHub
holman
464
140k
Practical Orchestrator
shlominoach
191
12k
Transcript
C++20 射影変換 高橋 晶 (Akira Takahashi)
[email protected]
Preferred Networks, Inc.
2025/06/20 (金) C++ breaktime 2025 / Summer
自己紹介 • Preferred Networks社で、スーパーコンピュータMN-Coreの ソフトウェアを作っています • エミュレータとかアセンブラとかの低レイヤーなものを作ってます • 通信系のゲームエンジンを作ってます •
C++の日本語リファレンスサイトcpprefjpを作っています • 著書 • 『C++テンプレートテクニック』 • 『C++ポケットリファレンス』 • 『プログラミングの魔導書』 • 東京で2〜3ヶ月ごとにC++ MIXという勉強会を開催しています
C++20ではアルゴリズムに射影変換という機能が 追加されています • 最近まで知りませんでした • Range関係でいっしょに入った機能なので埋もれていました
アルゴリズムおさらい • C++標準のアルゴリズムは、コンテナ と分離され、イテレータという中間イン タフェースを介して各要素にアクセスす る // コンテナはもちろん、 vector<T> v;
auto it = find( v.begin(), v.end(), x); // 組み込み配列にも使える T ar[N]; auto p = find( ar, ar + N, x );
アルゴリズムおさらい • C++20ではRangeに対応した // コンテナはもちろん、 vector<T> v; auto it =
ranges::find( v, x); // 組み込み配列にも使える T ar[N]; auto p = ranges::find( ar, x );
findとかcountってじつは不便 • 特定の値を検索するfind • 特定の値の個数を取得するcount • これらはそんなに活躍しない • コンテナの要素型や検索条件は そんなに単純ではないから
vector<T> v; auto it = ranges::find( v, x); int n = ranges::count( ar, x );
findとかcountってじつは不便 • より細かい条件を設定できるfind_if / count_ifが使われがち vector<T> v; auto it =
ranges::find_if( v, [](T x) { return x > 0; }); int n = ranges::count_if( ar, [](T x) { return x.kind == Weapon; } );
C++20 射影変換で値を変換できるようになった • より細かい条件を設定できるfind_if / count_ifが使われがち • C++20では射影変換 (projection) と
いう機能が入り、値を変換した結果 で検索ができるようになった • メンバ変数ポインタ、メンバ関数 ポインタ、関数オブジェクトなどを 指定できる vector<T> v; auto it = ranges::find( v, x, // xはnameの型 &T::name); // nameの値を検索 int n = ranges::count( ar, Weapon, [](T x) { return x.kind; } );
変換時の値コピーに注意 • メンバポインタならパフォーマンス 上の問題はないが、 • ラムダ式を指定する場合、 パフォーマンス劣化に注意 • 戻り値の型を指定して、参照を返す ようにしよう
vector<T> v; auto it = ranges::find( v, x, // コピーされないよう型を指定 [](T x) -> const string& { return x.name; } );
変換時の値コピーに注意 • decltype(auto)でもOK • return文にカッコをつけないとコ ピーになるので注意 vector<T> v; auto it
= ranges::find( v, x, // コピーされないよう型を指定 [](T x) -> decltype(auto) { return (x.name); } );
射影変換がサポートされているアルゴリズムか確認 template <input_range R, class Proj = identity, class T
= projected_value_t<iterator_t<R>, Proj>> constexpr borrowed_iterator_t<R> find(R&& r, const T& value, Proj proj = {}); • アルゴリズムが射影変換に対応しているかは、 パラメータに「Proj proj」があるかで確認できる • パラメータのどの値が変換されるかは、projected_value_tが 使われているかで確認できる
今回は以上です! • 射影変換は、いくつかの状況でコードをより単純化で きます • 複雑な条件が必要ない状況で便利に使えます