Upload
hiro-h
View
105
Download
0
Embed Size (px)
Citation preview
C++のライブラリを 簡単に眺めてみよう
H.Hiro @ Sapporo.cpp
http://hhiro.net/
Twitter: @h_hiro_ github: maraigue
2017/3/19 1 でじぽろ #13 & 札幌C++勉強会
自己紹介
H.Hiro
• 札幌(30年ちょっと在住)→名古屋(そろそろ3年目)
• 現在札幌在住じゃないけどSapporo.cppの運営やってます
• 情報系の研究の仕事してます
• 仕事ではC++がメイン、個人的にはRubyをよく使う、 最近Pythonをたまに使ったり
2017/3/19 2 でじぽろ #13 & 札幌C++勉強会
今日話すこと
• C++の標準ライブラリを簡単に巡ってみる
– 細かい機能までは立ち入りません
• C++を使ったことがない方:
– 「C++では標準でこんなことができるよ!」と いうのを知ることで、C++利用の助けになってほしい
– 「他の言語を利用しているけどC++はまだ」って 方は、ぜひ比較しながら眺めてみてほしい
• C++を使っているという方:
– 意外と知らないライブラリが見つかるかも?
2017/3/19 でじぽろ #13 & 札幌C++勉強会 3
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++勉強会
リファレンスを見てみる
• 日本語だと https://cpprefjp.github.io/
• 英語だと http://en.cppreference.com/w/
が有名だろうか。
MSDNを読むこともあるかな。
2017/3/19 でじぽろ #13 & 札幌C++勉強会 5
リファレンスを見てみる
• https://cpprefjp.github.io/
2017/3/19 でじぽろ #13 & 札幌C++勉強会 6
リファレンスを見てみる
• https://cpprefjp.github.io/
• ずらっと 並んでます
2017/3/19 でじぽろ #13 & 札幌C++勉強会 7
解説
• これじゃ何ができるのかわからないよね!
• ということで、私がいくつか分類してみたので 紹介したいと思います
2017/3/19 でじぽろ #13 & 札幌C++勉強会 8
(1) 基本中の基本
2017/3/19 でじぽろ #13 & 札幌C++勉強会 9
ヘッダ ファイル名
内容
iostream 入出力。最初勉強するのにどうしても 必要になるから、みんな遭遇するはず。
fstream ファイル入出力。iostreamと似た使い方。
string 文字列
vector 可変長配列
• 文字列や可変長配列が、C言語のように自前でポインタを 扱わなくても利用できる。
• ほか、スマートポインタ(後述)や参照型(詳細略) などもあり、C++でポインタを生で扱う必要性は薄い。
(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
集合や多重集合。 出現数を数えたり重複を排除したり。
配列や連想配列の注意点
C++では、 ["3.14", 3.14, [3, 1, 4]] とか {"foo": "bar", "hoge": 1} など 複数の型の値が混ざった配列や連想配列は 単純には作れない。
• 型の制限が緩い言語ならあまり困らないし、 JavaやC#でもObject型を使えばよいのだけど、 C++でそれらに相当することを(自前で)しようと するとかなり面倒。
• 作れないわけではない(工夫すれば作れるし そういう外部ライブラリもある)のだが、ここでは 省略する。
2017/3/19 でじぽろ #13 & 札幌C++勉強会 11
(2)プログラム内部の データフォーマットに (2/2)
2017/3/19 でじぽろ #13 & 札幌C++勉強会 12
ヘッダ ファイル名
内容
array*11 固定長配列のクラス。 単に arr[10] とかで定義するよりも便利。
bitset 固定長のビット配列(可変長は vector<bool>を使うという方法あり)。
valarray
vectorと似るが、複数の数値に対して 一括で処理をする(例:すべての要素を 2倍する)に適している。 環境によっては並列最適化される。
• 分数を表すクラス(つまり、分数の加減乗除等ができる) は、どういうわけか標準化されていない。 私は必要ならboost.rationalを使ったりしている。
(3)数学や統計処理など (1/2)
2017/3/19 でじぽろ #13 & 札幌C++勉強会 13
ヘッダ ファイル名
内容
cmath 各種数学関数。 ただし、数学関数でも一部はcstdlibに。
complex 複素数。2次元空間の座標としても。
ratio*11 分数を表す定数。
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);
...
}
(3)数学や統計処理など (2/2)
2017/3/19 でじぽろ #13 & 札幌C++勉強会 15
ヘッダ ファイル名
内容
algorithm 配列等に対し、全要素を見て行う 処理を提供する関数群。「検索する」 「ソート(順に並び替える)」など
numeric algorithmに似るが、数値関連のものが ここにある。「全要素の総和」など。
random*11 疑似乱数発生のための各種クラス。 C言語スタイルの乱数(<cstdlib>で可能) よりもできることはかなり増えている。
「検索する」とか「ソートする」とかが 別のヘッダファイルにある?
• 「検索する」とか「ソートする」とかは、他の言語だと 配列等のメソッドとして定義されているものも多い。
• 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
(4)文字列関連
2017/3/19 でじぽろ #13 & 札幌C++勉強会 17
ヘッダ ファイル名
内容
regex*11 正規表現。
sstream 文字列ストリーム。 標準入出力やファイルに書き出すような 方法で、文字列を生成できる。
string_view*17
(部分)文字列をコピーせずに取得する。 詳しくは私の以前の発表を https://www.slideshare.net/maraigue/boost-21-c1zstringview
(5)スレッド
2017/3/19 でじぽろ #13 & 札幌C++勉強会 18
ヘッダ ファイル名
内容
thread*11 スレッド。複数の処理を並行して行う 際に用いる。
future*11 スレッドを使って「他の処理が終わるまで 待つ」という状況を表現する。
condition_variable*11
指定した条件が満たされるまで、スレッドを 待たせる。
mutex*11 ミューテックスによる排他制御。
atomic*11 アトミック(不可分な)処理のライブラリ。 mutexよりできることは限られるが軽い。
(6)その他
2017/3/19 でじぽろ #13 & 札幌C++勉強会 19
ヘッダ ファイル名
内容
iomanip 入出力のフォーマット定義。 「小数点以下~桁まで出力」など。 一部は <ios> に定義。
ios 入出力全般に必要な処理を定義。
chrono 時間・時刻を表現するためのクラスなど。
stdexcept 例外を表すクラスが定義されている。
exception 例外を扱う関数等が定義されている。
filesystem*17 ファイル操作(コピーなど)
(7)上級編 (1/2)
• C++11では他にも無名関数が規格化されるなど、 関数オブジェクト周辺の使い勝手がかなり向上して います。
• スマートポインタについては次頁で説明します。
2017/3/19 でじぽろ #13 & 札幌C++勉強会 20
ヘッダ ファイル名
内容
functional 基本的な関数に対する関数オブジェクト (加算など)や、function型*11 (関数を保持する型)などを定義。
memory メモリ管理関連のクラスや関数群。 よく使うのは「スマートポインタ」*11。
スマートポインタとは
• newしたメモリ領域のdeleteを、一定の条件下で 勝手に行ってくれる。
• unique_ptr(newした領域が1か所からしか参照されない 場合に用いる)、shared_ptr(2か所以上でも対応)、 weak_ptr(詳細略)がある。
• C++ではガベージコレクションがないため、 メモリの解放をコントロールすることは重要
2017/3/19 でじぽろ #13 & 札幌C++勉強会 21
スマートポインタとは
• 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
(7)上級編 (2/2)
2017/3/19 でじぽろ #13 & 札幌C++勉強会 23
ヘッダ ファイル名
内容
typeinfo
実行時型情報。 型の名前を得たり、型が同じであるかの 判断が、実行時にできる。
type_traits*11
「ある型にconstを付けたもの」など、 型に対する加工を行う(コンパイル時)。 templateと組み合わせて用いることが 多いだろうか。
おわりに
2017/3/19 でじぽろ #13 & 札幌C++勉強会 24
おわりに
• 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