Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
コンテナと文字列の中間インタフェースspanとstring_view
Search
Akira Takahashi
June 15, 2024
Programming
1
590
コンテナと文字列の中間インタフェースspanとstring_view
Akira Takahashi
June 15, 2024
Tweet
Share
More Decks by Akira Takahashi
See All by Akira Takahashi
P2P通信の標準化 WebRTCを知ろう
faithandbrave
6
2.9k
C++20 射影変換
faithandbrave
0
700
C++26アップデート 2025-03
faithandbrave
0
1.9k
C++26 エラー性動作
faithandbrave
2
1.2k
C++20の整数
faithandbrave
0
240
C++23 スタックトレースライブラリ
faithandbrave
0
560
if constexpr文はテンプレート世界のラムダ式である
faithandbrave
3
1.4k
使いたい標準C++機能がない環境でいかに実装・設計するか
faithandbrave
2
1.2k
C++20からC++23までの変化
faithandbrave
9
12k
Other Decks in Programming
See All in Programming
AIコーディングエージェント(NotebookLM)
kondai24
0
120
【CA.ai #3】ワークフローから見直すAIエージェント — 必要な場面と“選ばない”判断
satoaoaka
0
210
ハイパーメディア駆動アプリケーションとIslandアーキテクチャ: htmxによるWebアプリケーション開発と動的UIの局所的適用
nowaki28
0
330
CSC509 Lecture 14
javiergs
PRO
0
220
バックエンドエンジニアによる Amebaブログ K8s 基盤への CronJobの導入・運用経験
sunabig
0
130
認証・認可の基本を学ぼう前編
kouyuume
0
150
TypeScript 5.9 で使えるようになった import defer でパフォーマンス最適化を実現する
bicstone
1
1k
堅牢なフロントエンドテスト基盤を構築するために行った取り組み
shogo4131
6
1.9k
AIエージェントを活かすPM術 AI駆動開発の現場から
gyuta
0
230
connect-python: convenient protobuf RPC for Python
anuraaga
0
350
Evolving NEWT’s TypeScript Backend for the AI-Driven Era
xpromx
0
260
[SF Ruby Conf 2025] Rails X
palkan
0
440
Featured
See All Featured
The World Runs on Bad Software
bkeepers
PRO
72
12k
Done Done
chrislema
186
16k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.8k
Become a Pro
speakerdeck
PRO
30
5.7k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.2k
Why You Should Never Use an ORM
jnunemaker
PRO
60
9.6k
Building an army of robots
kneath
306
46k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
690
Git: the NoSQL Database
bkeepers
PRO
432
66k
BBQ
matthewcrist
89
9.9k
What's in a price? How to price your products and services
michaelherold
246
12k
A designer walks into a library…
pauljervisheath
210
24k
Transcript
ίϯςφɾจࣈྻͷதؒΠϯλϑΣʔε TQBOͱTUSJOH@WJFX ߴڮ থ "LJSB5BLBIBTIJ GBJUIBOECSBWF!HNBJMDPN 1SFGFSSFE/FUXPSLT *OD ۚ
$ .*9
৽ඪ४ɿίϯςφͱจࣈྻͷड͚औΓํ • $ Ͱೖͬͨstd::spanίϯςφΛड͚औΔͨΊͷܕ • $ Ͱೖͬͨstd::string_viewจࣈྻΛड͚औΔͨΊͷܕ • ͜ΕΒৗతʹ͏ϢʔςΟϦςΟͰ͕͢ɺ᠘͋Γ·͢ •
Ұஈ֊ϥοϓ͢Δ͜ͱͰɺΑΓศརʹͳΔέʔε͋Γ·͢ • ৽ͨͳͨΓલͱͳΔ࡞๏ΛֶΜͰ͍͖·͠ΐ͏
TQBO $ void process(span<int> data) { for (int
x : data) { println("{}", x); } } vector<int> v = {1, 2, 3}; int ar[] = {4, 5, 6}; process(span<int>{v}); // 明示的な変換が必要 process(ar); • TQBOɺϝϞϦ࿈ଓੑͷ͋Δίϯςφ WFDUPSྻ Λ ڞ௨ͯ͠ड͚औΔΠϯλϑΣʔεͱͯ͠༻Ͱ͖Δܕ • ॴ༗ݖΛͨͣɺઌ಄ཁૉͷϙΠϯλͱαΠζ͚ͩΛͭ
TQBO $ void process(span<int> data) { // 一部配列を取り出したりしても要素のコピーが発生しない
process_header(data.front()); process_body(span{data.begin() + 1, data.end()}); } • ཁૉͷίϐʔ͕ൃੜ͠ͳ͍ͷͰɺؾܰʹ෦ྻͷૢ࡞͕Ͱ͖Δ • ͨͩ͠ɺॴ༗ݖΛ͓ͬͯΒͣ σʔλࢀর͍ͯ͠Δ͚ͩ ࣋ͪӡͼʹ͔ͳ͍ͷͰҙ
TUSJOH@WJFX $ void process(string_view sv) { println("{}", sv.substr(1, 3));
} process("Hello"); process(string{"World"}); • string_viewɺจࣈྻͱstringͷڞ௨ΠϯλϑΣʔε • จࣈྻʹରͯ͠stringͷศརͳϝϯόؔΛ͑Δ • ཁૉͷίϐʔϝϞϦ֬อ͕ൃੜ͠ͳ͍ͷͰ ෦จࣈྻͷૢ࡞ؾܰʹͰ͖Δ • ॴ༗ݖΛͨͳ͍ͷͰɺ࣋ͪӡͼʹ͋·Γ͔ͳ͍ • จࣈྻϦςϥϧTUBUJDͳण໋ΛͭͷͰɺͱͯ͠จࣈྻϦςϥϧΛ ͭ߹࣋ͪӡΔ
᠘ͦͷ෦ྻͰඌ͕ͣΕΔ void f(const char* s) { cout << s <<
endl; } void process(string_view sv) { f(sv.substr(1, 3).data()); } process("Hello"); // 「ell」を期待するが「ello」が出力される • const char*ͰจࣈྻΛड͚औΔؔʹ෦จࣈྻΛ͢ͱ Γൈ͍ͨൣғͰͳ͘ඌ·Ͱͬͯ͠·͏ • f(const char* s, int size)ܗࣜʹͳ͍ͬͯͳ͍ͱࠔΔ • ͦͷΑ͏ͳঢ়گͰɺҰ୴TUSJOHʹมͨ͠Γ͢Δඞཁ͕͋Δ • ͘͠ɺඌΛΕͳ͍Α͏҆શʹϥοϓ͢Δ͜ͱߟ͑ΒΕΔ
᠘ͦͷ࣋ͪӡͼʹ͍͘ class X { vector<int> _data; public: // こういう使い方はOK span<int>
f() { return {_data.begin() + 1, _data.end()}; } // コンパイルは通るけど寿命切れ span<int> g() { vector<int> x = {1, 2, 3}; return {x.begin() + 1, x.end()}; } }; • spanͱstring_view ॴ༗ݖΛͨͳ͍ͷ Ͱ࣋ͪӡͼʹ͍͘ • ؔͷΓܕʹ ͠ʹ͍͘͠ɺϝϯό มͱͯͭ͠ͷ Ή͔͍ͣ͠
ॴ༗ݖΛPQUJPOBM লུՄ ʹͨͤΔ֦ு life_string_view f(life_string_view sv) { return sv.substr(1, 3);
} life_string_view g() { string s = "Hello"; return f(life_string_view::allocate(move(s))); } • string_viewܰྔͩ͠ɺ͍͍ͩͨͷσʔλจࣈྻϦςϥϧ TUBUJDͳण໋ ͔ͩΒɺͰ͖Εstring_viewͰ࣋ͪӡͼ͍ͨ • ͚ͩͲͨ·ʹจࣈྻϑΥʔϚοτͨ͠จࣈྻΛ͍࣋ͨͤͨ • ͜͏͍͏߹ͷͨΊʹɺॴ༗ݖΛͭΦϒδΣΫτΛPQUJPOBMʹ࣋ ͨͤΔ֦ு͕ߟ͑ΒΕΔ
ॴ༗ݖΛPQUJPOBM লུՄ ʹͨͤΔ֦ு struct life_string_view { std::string_view _data; std::shared_ptr<void> _life;
template <class T> static life_string_view allocate(T&& data) { auto p = std::make_shared<T>(std::forward<T>(data)); return {*p, p}; } …string_viewと同じメンバ関数を実装… • shared_ptr<void>Ͱॴ༗ݖΛ͍ͬ͠ΐʹ࣋ͪӡͿ • ॴ༗ݖΛͨ͞ͳ͚Εۭͷshared_ptr ϙΠϯλͱBUPNJDࢀরΧ ϯτ ͚ͩ༨ʹͭ
ิ • string_viewʹॴ༗ݖΛͨͤΔΞΠσΟΞɺBTZOD@NRUUϥ ΠϒϥϦ ۙ౻وढ़͞Μ࡞ Ͱ࣮ࡍʹΘΕ͍ͯ·͢ • IUUQTHJUIVCDPNSFECPMU[BTZOD@NRUUCMPCCGBEB EGFBCFCFFGBJODMVEFBTZOD@NRUUVUJMCVGGFS IQQ
• spanͱstring_view$ ͷ৽ৗࣝͱͯ͠ৗతʹΘΕ͍ͯ ͘͜ͱʹͳΓ·͕͢ɺؕΓ͍͢᠘͋Γ·͢ • ࡞๏Λʹ͚ͭͯɺ҆શʹ͍͖ͬͯ·͠ΐ͏ • ˎ ྻΛଟ࣍ݩྻͱͯ͠ΞΫηεͰ͖ΔΑ͏ʹ͢Δmdspan ͋Γ·͢ ઢܗϥΠϒϥϦͰଟ༻͍ͯ͘͜͠ͱʹͳΔ