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
0
740
C++20 射影変換
Akira Takahashi
June 20, 2025
Tweet
Share
More Decks by Akira Takahashi
See All by Akira Takahashi
P2P通信の標準化 WebRTCを知ろう
faithandbrave
6
3k
C++26アップデート 2025-03
faithandbrave
0
2k
C++26 エラー性動作
faithandbrave
2
1.2k
C++20の整数
faithandbrave
0
260
コンテナと文字列の中間インタフェースspanとstring_view
faithandbrave
1
610
C++23 スタックトレースライブラリ
faithandbrave
0
590
if constexpr文はテンプレート世界のラムダ式である
faithandbrave
3
1.5k
使いたい標準C++機能がない環境でいかに実装・設計するか
faithandbrave
2
1.3k
C++20からC++23までの変化
faithandbrave
9
12k
Other Decks in Programming
See All in Programming
高速開発のためのコード整理術
sutetotanuki
1
410
AIによる高速開発をどう制御するか? ガードレール設置で開発速度と品質を両立させたチームの事例
tonkotsuboy_com
7
2.4k
CSC307 Lecture 04
javiergs
PRO
0
660
なるべく楽してバックエンドに型をつけたい!(楽とは言ってない)
hibiki_cube
0
140
AIによる開発の民主化を支える コンテキスト管理のこれまでとこれから
mulyu
3
480
並行開発のためのコードレビュー
miyukiw
0
1.2k
余白を設計しフロントエンド開発を 加速させる
tsukuha
7
2.1k
そのAIレビュー、レビューしてますか? / Are you reviewing those AI reviews?
rkaga
6
4.6k
Honoを使ったリモートMCPサーバでAIツールとの連携を加速させる!
tosuri13
1
180
Automatic Grammar Agreementと Markdown Extended Attributes について
kishikawakatsumi
0
200
OCaml 5でモダンな並列プログラミングを Enjoyしよう!
haochenx
0
140
2026年 エンジニアリング自己学習法
yumechi
0
140
Featured
See All Featured
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
1.9k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
170
Documentation Writing (for coders)
carmenintech
77
5.3k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
0
160
[SF Ruby Conf 2025] Rails X
palkan
1
760
New Earth Scene 8
popppiees
1
1.5k
It's Worth the Effort
3n
188
29k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
110
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.4k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.8k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
230
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.4k
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が 使われているかで確認できる
今回は以上です! • 射影変換は、いくつかの状況でコードをより単純化で きます • 複雑な条件が必要ない状況で便利に使えます