25
C++のライブラリを 簡単に眺めてみよう H.Hiro @ Sapporo.cpp http://hhiro.net/ Twitter: @h_hiro_ github: maraigue 2017/3/19 1 でじぽろ #13 & 札幌C++勉強会

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

  • Upload
    hiro-h

  • View
    105

  • Download
    0

Embed Size (px)

Citation preview

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

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

H.Hiro @ Sapporo.cpp

http://hhiro.net/

Twitter: @h_hiro_ github: maraigue

2017/3/19 1 でじぽろ #13 & 札幌C++勉強会

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

自己紹介

H.Hiro

• 札幌(30年ちょっと在住)→名古屋(そろそろ3年目)

• 現在札幌在住じゃないけどSapporo.cppの運営やってます

• 情報系の研究の仕事してます

• 仕事ではC++がメイン、個人的にはRubyをよく使う、 最近Pythonをたまに使ったり

2017/3/19 2 でじぽろ #13 & 札幌C++勉強会

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

今日話すこと

• C++の標準ライブラリを簡単に巡ってみる

– 細かい機能までは立ち入りません

• C++を使ったことがない方:

– 「C++では標準でこんなことができるよ!」と いうのを知ることで、C++利用の助けになってほしい

– 「他の言語を利用しているけどC++はまだ」って 方は、ぜひ比較しながら眺めてみてほしい

• C++を使っているという方:

– 意外と知らないライブラリが見つかるかも?

2017/3/19 でじぽろ #13 & 札幌C++勉強会 3

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

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++勉強会

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

リファレンスを見てみる

• 日本語だと https://cpprefjp.github.io/

• 英語だと http://en.cppreference.com/w/

が有名だろうか。

MSDNを読むこともあるかな。

2017/3/19 でじぽろ #13 & 札幌C++勉強会 5

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

リファレンスを見てみる

• https://cpprefjp.github.io/

2017/3/19 でじぽろ #13 & 札幌C++勉強会 6

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

リファレンスを見てみる

• https://cpprefjp.github.io/

• ずらっと 並んでます

2017/3/19 でじぽろ #13 & 札幌C++勉強会 7

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

解説

• これじゃ何ができるのかわからないよね!

• ということで、私がいくつか分類してみたので 紹介したいと思います

2017/3/19 でじぽろ #13 & 札幌C++勉強会 8

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

(1) 基本中の基本

2017/3/19 でじぽろ #13 & 札幌C++勉強会 9

ヘッダ ファイル名

内容

iostream 入出力。最初勉強するのにどうしても 必要になるから、みんな遭遇するはず。

fstream ファイル入出力。iostreamと似た使い方。

string 文字列

vector 可変長配列

• 文字列や可変長配列が、C言語のように自前でポインタを 扱わなくても利用できる。

• ほか、スマートポインタ(後述)や参照型(詳細略) などもあり、C++でポインタを生で扱う必要性は薄い。

Page 10: 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

集合や多重集合。 出現数を数えたり重複を排除したり。

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

配列や連想配列の注意点

C++では、 ["3.14", 3.14, [3, 1, 4]] とか {"foo": "bar", "hoge": 1} など 複数の型の値が混ざった配列や連想配列は 単純には作れない。

• 型の制限が緩い言語ならあまり困らないし、 JavaやC#でもObject型を使えばよいのだけど、 C++でそれらに相当することを(自前で)しようと するとかなり面倒。

• 作れないわけではない(工夫すれば作れるし そういう外部ライブラリもある)のだが、ここでは 省略する。

2017/3/19 でじぽろ #13 & 札幌C++勉強会 11

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

(2)プログラム内部の データフォーマットに (2/2)

2017/3/19 でじぽろ #13 & 札幌C++勉強会 12

ヘッダ ファイル名

内容

array*11 固定長配列のクラス。 単に arr[10] とかで定義するよりも便利。

bitset 固定長のビット配列(可変長は vector<bool>を使うという方法あり)。

valarray

vectorと似るが、複数の数値に対して 一括で処理をする(例:すべての要素を 2倍する)に適している。 環境によっては並列最適化される。

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

• 分数を表すクラス(つまり、分数の加減乗除等ができる) は、どういうわけか標準化されていない。 私は必要ならboost.rationalを使ったりしている。

(3)数学や統計処理など (1/2)

2017/3/19 でじぽろ #13 & 札幌C++勉強会 13

ヘッダ ファイル名

内容

cmath 各種数学関数。 ただし、数学関数でも一部はcstdlibに。

complex 複素数。2次元空間の座標としても。

ratio*11 分数を表す定数。

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

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);

...

}

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

(3)数学や統計処理など (2/2)

2017/3/19 でじぽろ #13 & 札幌C++勉強会 15

ヘッダ ファイル名

内容

algorithm 配列等に対し、全要素を見て行う 処理を提供する関数群。「検索する」 「ソート(順に並び替える)」など

numeric algorithmに似るが、数値関連のものが ここにある。「全要素の総和」など。

random*11 疑似乱数発生のための各種クラス。 C言語スタイルの乱数(<cstdlib>で可能) よりもできることはかなり増えている。

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

「検索する」とか「ソートする」とかが 別のヘッダファイルにある?

• 「検索する」とか「ソートする」とかは、他の言語だと 配列等のメソッドとして定義されているものも多い。

• 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

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

(4)文字列関連

2017/3/19 でじぽろ #13 & 札幌C++勉強会 17

ヘッダ ファイル名

内容

regex*11 正規表現。

sstream 文字列ストリーム。 標準入出力やファイルに書き出すような 方法で、文字列を生成できる。

string_view*17

(部分)文字列をコピーせずに取得する。 詳しくは私の以前の発表を https://www.slideshare.net/maraigue/boost-21-c1zstringview

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

(5)スレッド

2017/3/19 でじぽろ #13 & 札幌C++勉強会 18

ヘッダ ファイル名

内容

thread*11 スレッド。複数の処理を並行して行う 際に用いる。

future*11 スレッドを使って「他の処理が終わるまで 待つ」という状況を表現する。

condition_variable*11

指定した条件が満たされるまで、スレッドを 待たせる。

mutex*11 ミューテックスによる排他制御。

atomic*11 アトミック(不可分な)処理のライブラリ。 mutexよりできることは限られるが軽い。

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

(6)その他

2017/3/19 でじぽろ #13 & 札幌C++勉強会 19

ヘッダ ファイル名

内容

iomanip 入出力のフォーマット定義。 「小数点以下~桁まで出力」など。 一部は <ios> に定義。

ios 入出力全般に必要な処理を定義。

chrono 時間・時刻を表現するためのクラスなど。

stdexcept 例外を表すクラスが定義されている。

exception 例外を扱う関数等が定義されている。

filesystem*17 ファイル操作(コピーなど)

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

(7)上級編 (1/2)

• C++11では他にも無名関数が規格化されるなど、 関数オブジェクト周辺の使い勝手がかなり向上して います。

• スマートポインタについては次頁で説明します。

2017/3/19 でじぽろ #13 & 札幌C++勉強会 20

ヘッダ ファイル名

内容

functional 基本的な関数に対する関数オブジェクト (加算など)や、function型*11 (関数を保持する型)などを定義。

memory メモリ管理関連のクラスや関数群。 よく使うのは「スマートポインタ」*11。

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

スマートポインタとは

• newしたメモリ領域のdeleteを、一定の条件下で 勝手に行ってくれる。

• unique_ptr(newした領域が1か所からしか参照されない 場合に用いる)、shared_ptr(2か所以上でも対応)、 weak_ptr(詳細略)がある。

• C++ではガベージコレクションがないため、 メモリの解放をコントロールすることは重要

2017/3/19 でじぽろ #13 & 札幌C++勉強会 21

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

スマートポインタとは

• 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

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

(7)上級編 (2/2)

2017/3/19 でじぽろ #13 & 札幌C++勉強会 23

ヘッダ ファイル名

内容

typeinfo

実行時型情報。 型の名前を得たり、型が同じであるかの 判断が、実行時にできる。

type_traits*11

「ある型にconstを付けたもの」など、 型に対する加工を行う(コンパイル時)。 templateと組み合わせて用いることが 多いだろうか。

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

おわりに

2017/3/19 でじぽろ #13 & 札幌C++勉強会 24

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

おわりに

• 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