狠狠撸

狠狠撸Share a Scribd company logo
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と似るが計算コストが異なる。
詳しくは私の以前の発表を
/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
(部分)文字列をコピーせずに取得する。
詳しくは私の以前の発表を
/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

More Related Content

颁++のライブラリを简単に眺めてみよう