Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

C++のライブラリを簡単に眺めてみよう

3,129 views

Published on

2017.3.19 でじぽろ #13 & 札幌C++勉強会 https://digiporo.connpass.com/event/52265/ での発表内容。C++の標準ライブラリを簡単に眺めます。

Published in: Software
  • Be the first to comment

  • Be the first to like this

C++のライブラリを簡単に眺めてみよう

  1. 1. C++のライブラリを 簡単に眺めてみよう H.Hiro @ Sapporo.cpp http://hhiro.net/ Twitter: @h_hiro_ github: maraigue 2017/3/19 1でじぽろ #13 & 札幌C++勉強会
  2. 2. 自己紹介 H.Hiro • 札幌(30年ちょっと在住)→名古屋(そろそろ3年目) • 現在札幌在住じゃないけどSapporo.cppの運営やってます • 情報系の研究の仕事してます • 仕事ではC++がメイン、個人的にはRubyをよく使う、 最近Pythonをたまに使ったり 2017/3/19 2でじぽろ #13 & 札幌C++勉強会
  3. 3. 今日話すこと • C++の標準ライブラリを簡単に巡ってみる – 細かい機能までは立ち入りません • C++を使ったことがない方: – 「C++では標準でこんなことができるよ!」と いうのを知ることで、C++利用の助けになってほしい – 「他の言語を利用しているけどC++はまだ」って 方は、ぜひ比較しながら眺めてみてほしい • C++を使っているという方: – 意外と知らないライブラリが見つかるかも? 2017/3/19 でじぽろ #13 & 札幌C++勉強会 3
  4. 4. C++の標準ライブラリ • C言語のような不便さは想像しないでほしい。 それと比べるとかなり充実している – オブジェクト指向が言語に取り入れられているため ライブラリ設計がしやすいという事情もあるかと • 標準規格が進化し続いている (C++98→ C++03→C++11→C++14→C++17…) – 最近のコンパイラを導入すれば、少なくとも C++11の機能はだいたい対応しているはず – コンパイラで対応してなくても、Boost C++ Library で類似の機能が使える場合が多い – 以下本文中では、「C++11で規格化」のことを 記号「*11」で表します(*14、*17も同様) 2017/3/19 4でじぽろ #13 & 札幌C++勉強会
  5. 5. リファレンスを見てみる • 日本語だと https://cpprefjp.github.io/ • 英語だと http://en.cppreference.com/w/ が有名だろうか。 MSDNを読むこともあるかな。 2017/3/19 でじぽろ #13 & 札幌C++勉強会 5
  6. 6. リファレンスを見てみる • https://cpprefjp.github.io/ 2017/3/19 でじぽろ #13 & 札幌C++勉強会 6
  7. 7. リファレンスを見てみる • https://cpprefjp.github.io/ • ずらっと 並んでます 2017/3/19 でじぽろ #13 & 札幌C++勉強会 7
  8. 8. 解説 • これじゃ何ができるのかわからないよね! • ということで、私がいくつか分類してみたので 紹介したいと思います 2017/3/19 でじぽろ #13 & 札幌C++勉強会 8
  9. 9. (1) 基本中の基本 2017/3/19 でじぽろ #13 & 札幌C++勉強会 9 ヘッダ ファイル名 内容 iostream 入出力。最初勉強するのにどうしても 必要になるから、みんな遭遇するはず。 fstream ファイル入出力。iostreamと似た使い方。 string 文字列 vector 可変長配列 • 文字列や可変長配列が、C言語のように自前でポインタを 扱わなくても利用できる。 • ほか、スマートポインタ(後述)や参照型(詳細略) などもあり、C++でポインタを生で扱う必要性は薄い。
  10. 10. (2)プログラム内部の データフォーマットに (1/2) 2017/3/19 でじぽろ #13 & 札幌C++勉強会 10 ヘッダ ファイル名 内容 map unordered_map*11 連想配列 deque list forward_list*11 vectorと似るが計算コストが異なる。 詳しくは私の以前の発表を https://www.slideshare.net/maraigue/choosing- typesinstl utility 「二つの値の組」を表すpair型が便利。 tuple*11 pairと似るが、三つ以上の組も可。 set unordered_set*11 集合や多重集合。 出現数を数えたり重複を排除したり。
  11. 11. 配列や連想配列の注意点 C++では、 ["3.14", 3.14, [3, 1, 4]] とか {"foo": "bar", "hoge": 1} など 複数の型の値が混ざった配列や連想配列は 単純には作れない。 • 型の制限が緩い言語ならあまり困らないし、 JavaやC#でもObject型を使えばよいのだけど、 C++でそれらに相当することを(自前で)しようと するとかなり面倒。 • 作れないわけではない(工夫すれば作れるし そういう外部ライブラリもある)のだが、ここでは 省略する。 2017/3/19 でじぽろ #13 & 札幌C++勉強会 11
  12. 12. (2)プログラム内部の データフォーマットに (2/2) 2017/3/19 でじぽろ #13 & 札幌C++勉強会 12 ヘッダ ファイル名 内容 array*11 固定長配列のクラス。 単に arr[10] とかで定義するよりも便利。 bitset 固定長のビット配列(可変長は vector<bool>を使うという方法あり)。 valarray vectorと似るが、複数の数値に対して 一括で処理をする(例:すべての要素を 2倍する)に適している。 環境によっては並列最適化される。
  13. 13. • 分数を表すクラス(つまり、分数の加減乗除等ができる) は、どういうわけか標準化されていない。 私は必要ならboost.rationalを使ったりしている。 (3)数学や統計処理など (1/2) 2017/3/19 でじぽろ #13 & 札幌C++勉強会 13 ヘッダ ファイル名 内容 cmath 各種数学関数。 ただし、数学関数でも一部はcstdlibに。 complex 複素数。2次元空間の座標としても。 ratio*11 分数を表す定数。
  14. 14. C言語のライブラリをC++で使う • 先程の cmath は、C言語の math.h のC++対応版 • 他のC言語のヘッダファイルも同様に#includeできる • cmathなどを使うと、std::関数名 で呼び出すことになる →グローバル関数を余計に作らなくて済む 2017/3/19 でじぽろ #13 & 札幌C++勉強会 14 #include <cmath> int main(void){ double x = std::log(2); ... } #include <math.h> int main(void){ double x = log(2); ... }
  15. 15. (3)数学や統計処理など (2/2) 2017/3/19 でじぽろ #13 & 札幌C++勉強会 15 ヘッダ ファイル名 内容 algorithm 配列等に対し、全要素を見て行う 処理を提供する関数群。「検索する」 「ソート(順に並び替える)」など numeric algorithmに似るが、数値関連のものが ここにある。「全要素の総和」など。 random*11 疑似乱数発生のための各種クラス。 C言語スタイルの乱数(<cstdlib>で可能) よりもできることはかなり増えている。
  16. 16. 「検索する」とか「ソートする」とかが 別のヘッダファイルにある? • 「検索する」とか「ソートする」とかは、他の言語だと 配列等のメソッドとして定義されているものも多い。 • C++では、std::findやstd::sortなどの関数に 配列等の先頭・末尾を指定するようになっている。 std::vector<int> v = ...; // 「10」という要素を探してイテレータを返す auto it = std::find(v.begin(), v.end(), 10); https://cpprefjp.github.io/reference/algorithm/find.html • C++の言語仕様の範囲内で、なおかつ 「どんな型でも、所定の要件を満たしていればstd::find (など)に与えてよい」という仕様にするには こうするしかなかった? 2017/3/19 でじぽろ #13 & 札幌C++勉強会 16
  17. 17. (4)文字列関連 2017/3/19 でじぽろ #13 & 札幌C++勉強会 17 ヘッダ ファイル名 内容 regex*11 正規表現。 sstream 文字列ストリーム。 標準入出力やファイルに書き出すような 方法で、文字列を生成できる。 string_view*17 (部分)文字列をコピーせずに取得する。 詳しくは私の以前の発表を https://www.slideshare.net/maraigue/boost-21- c1zstringview
  18. 18. (5)スレッド 2017/3/19 でじぽろ #13 & 札幌C++勉強会 18 ヘッダ ファイル名 内容 thread*11 スレッド。複数の処理を並行して行う 際に用いる。 future*11 スレッドを使って「他の処理が終わるまで 待つ」という状況を表現する。 condition_ variable*11 指定した条件が満たされるまで、スレッドを 待たせる。 mutex*11 ミューテックスによる排他制御。 atomic*11 アトミック(不可分な)処理のライブラリ。 mutexよりできることは限られるが軽い。
  19. 19. (6)その他 2017/3/19 でじぽろ #13 & 札幌C++勉強会 19 ヘッダ ファイル名 内容 iomanip 入出力のフォーマット定義。 「小数点以下~桁まで出力」など。 一部は <ios> に定義。 ios 入出力全般に必要な処理を定義。 chrono 時間・時刻を表現するためのクラスなど。 stdexcept 例外を表すクラスが定義されている。 exception 例外を扱う関数等が定義されている。 filesystem*17 ファイル操作(コピーなど)
  20. 20. (7)上級編 (1/2) • C++11では他にも無名関数が規格化されるなど、 関数オブジェクト周辺の使い勝手がかなり向上して います。 • スマートポインタについては次頁で説明します。 2017/3/19 でじぽろ #13 & 札幌C++勉強会 20 ヘッダ ファイル名 内容 functional 基本的な関数に対する関数オブジェクト (加算など)や、function型*11 (関数を保持する型)などを定義。 memory メモリ管理関連のクラスや関数群。 よく使うのは「スマートポインタ」*11。
  21. 21. スマートポインタとは • newしたメモリ領域のdeleteを、一定の条件下で 勝手に行ってくれる。 • unique_ptr(newした領域が1か所からしか参照されない 場合に用いる)、shared_ptr(2か所以上でも対応)、 weak_ptr(詳細略)がある。 • C++ではガベージコレクションがないため、 メモリの解放をコントロールすることは重要 2017/3/19 でじぽろ #13 & 札幌C++勉強会 21
  22. 22. スマートポインタとは • newしたメモリ領域のdeleteを、一定の条件下で 勝手に行ってくれる。 • unique_ptr(newした領域が1か所からしか参照されない 場合に用いる)、shared_ptr(2か所以上でも対応)、 weak_ptr(詳細略)がある。 2017/3/19 でじぽろ #13 & 札幌C++勉強会 22 #include <memory> int main(void){ std::unique_ptr<Cls> obj = std::unique_ptr<Cls>(new Cls()); ... // newした領域は勝手にdeleteされる } int main(void){ Cls * obj = new Cls(); ... delete obj; } サンプルコード http://melpon.org/wandbox/permlink/Iqu0g3MF5aRqE9aQ
  23. 23. (7)上級編 (2/2) 2017/3/19 でじぽろ #13 & 札幌C++勉強会 23 ヘッダ ファイル名 内容 typeinfo 実行時型情報。 型の名前を得たり、型が同じであるかの 判断が、実行時にできる。 type_traits*11 「ある型にconstを付けたもの」など、 型に対する加工を行う(コンパイル時)。 templateと組み合わせて用いることが 多いだろうか。
  24. 24. おわりに 2017/3/19 でじぽろ #13 & 札幌C++勉強会 24
  25. 25. おわりに • C++標準ライブラリをいくつか紹介してきました。 • C++を使っていると比較的問題になりやすい (こういうことできるだろうか?と考える)ような 標準ライブラリを中心に紹介しました。 • 実際まだもう少しあります。残るヘッダファイル: <typeindex> <initializer_list> <new> <scoped_allocator> <limits> <system_error> <deque> <stack> <queue> <iterator> <streambuf> <locale> <codecvt> (C言語にもあるもの、紹介したヘッダファイルの機能を限定したもの、 非推奨のもの、C++14以降で規格化されたものは除外) • これを、「C++の標準ライブラリだけでこんなこと できるんだっけ…?」と考えるにあたっての 手掛かりにしていただければ幸いです。 2017/3/19 でじぽろ #13 & 札幌C++勉強会 25

×