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

More Related Content

PDF
フラグを愛でる
PDF
関数型プログラミング入門 with OCaml
KEY
ラムダ計算入門
PDF
LR parsing
PDF
仮想マシンにおけるメモリ管理
PDF
明日使えないすごいビット演算
PDF
競プロは社会の役に立たない+ベンチャー企業の話 (NPCA夏合宿OB講演).pdf
PDF
CRC-32
フラグを愛でる
関数型プログラミング入門 with OCaml
ラムダ計算入門
LR parsing
仮想マシンにおけるメモリ管理
明日使えないすごいビット演算
競プロは社会の役に立たない+ベンチャー企業の話 (NPCA夏合宿OB講演).pdf
CRC-32

What's hot (20)

PPT
Glibc malloc internal
PPTX
競技プログラミングのためのC++入門
PDF
Constexpr 中3女子テクニック
PDF
Re永続データ構造が分からない人のためのスライド
PDF
関数プログラミング入門
PDF
条件分岐とcmovとmaxps
PDF
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
PDF
Haswellサーベイと有限体クラスの紹介
PPTX
AVX-512(フォーマット)詳解
PDF
これから Haskell を書くにあたって
PDF
競技プログラミングにおけるコードの書き方とその利便性
PDF
本当にわかる Spectre と Meltdown
PDF
STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)
PDF
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
PPTX
並列化による高速化
PDF
新しい並列for構文のご提案
PDF
PWNの超入門 大和セキュリティ神戸 2018-03-25
PDF
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
PDF
2017年11月02日「radare2」トーク/ワークショップAVTokyo 2017
PPTX
C#で速度を極めるいろは
Glibc malloc internal
競技プログラミングのためのC++入門
Constexpr 中3女子テクニック
Re永続データ構造が分からない人のためのスライド
関数プログラミング入門
条件分岐とcmovとmaxps
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Haswellサーベイと有限体クラスの紹介
AVX-512(フォーマット)詳解
これから Haskell を書くにあたって
競技プログラミングにおけるコードの書き方とその利便性
本当にわかる Spectre と Meltdown
STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)
OAuth 2.0 Web Messaging Response Mode - OpenID Summit Tokyo 2015
並列化による高速化
新しい並列for構文のご提案
PWNの超入門 大和セキュリティ神戸 2018-03-25
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
2017年11月02日「radare2」トーク/ワークショップAVTokyo 2017
C#で速度を極めるいろは
Ad

Viewers also liked (18)

PDF
Be & gg, indra sigit anggita, hapzi ali, philosophical ethics and business, u...
PPTX
MicroPython に手出してみないか?
PPTX
3Com 80-001958-02
PPTX
Golf Growing in Popularity with Women in Asia
PDF
Diagnóstico y tratamiento de dermatofitosis y pitiriasis versicolor
 
PPTX
Metodos de Union (Soldadura)
PPT
vaginal bleeding in early pregnancy
PDF
Creativity and Copywriting - Video
PPS
Approach to chronic kidney disease
PPTX
Revisión física del equipo de computó
PDF
Idea de la metafísica julián marías
PPTX
Moder poetry1
PPTX
Linea del tiempo historia de la tecnología
PDF
Performance Management
PPTX
Tango withwagtail
PPTX
Práctica con quandaray
PPTX
DOC
Curiculum Vitae
Be & gg, indra sigit anggita, hapzi ali, philosophical ethics and business, u...
MicroPython に手出してみないか?
3Com 80-001958-02
Golf Growing in Popularity with Women in Asia
Diagnóstico y tratamiento de dermatofitosis y pitiriasis versicolor
 
Metodos de Union (Soldadura)
vaginal bleeding in early pregnancy
Creativity and Copywriting - Video
Approach to chronic kidney disease
Revisión física del equipo de computó
Idea de la metafísica julián marías
Moder poetry1
Linea del tiempo historia de la tecnología
Performance Management
Tango withwagtail
Práctica con quandaray
Curiculum Vitae
Ad

Similar to C++のライブラリを簡単に眺めてみよう (20)

PDF
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
PDF
C++ lecture-0
PDF
わんくま同盟大阪勉強会#61
PDF
C++コミュニティーの中心でC++をDISる
PDF
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
PDF
C++11のつかいかた
PDF
中3女子でもわかる constexpr
PDF
C++14 Overview
PDF
boost tour 1.48.0 all
PDF
不遇の標準ライブラリ - valarray
PDF
Boost Tour 1.50.0 All
PDF
Boost tour 1_40_0
PDF
C++0x in programming competition
PDF
ゲーム開発者のための C++11/C++14
PDF
リテラル文字列型までの道
PDF
Boost Tour 1_58_0 merge
PDF
研究生のためのC++ no.5
PDF
Pfi Seminar 2010 1 7
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
C++ lecture-0
わんくま同盟大阪勉強会#61
C++コミュニティーの中心でC++をDISる
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++11のつかいかた
中3女子でもわかる constexpr
C++14 Overview
boost tour 1.48.0 all
不遇の標準ライブラリ - valarray
Boost Tour 1.50.0 All
Boost tour 1_40_0
C++0x in programming competition
ゲーム開発者のための C++11/C++14
リテラル文字列型までの道
Boost Tour 1_58_0 merge
研究生のためのC++ no.5
Pfi Seminar 2010 1 7

More from Hiro H. (20)

PDF
シンデレラガールズの「シンプルな」カードゲームを作りたい(アイマスハッカソン2024)
PDF
pandas便利だけどデフォルトパラメータでファイルを読み込むな!
PDF
式を書くだけで最適化計算してほしい!~CVXPY編~
PDF
旅行「#重複乗車禁止で名鉄完乗」とその数学的な解説
PDF
シンデレラガール総選挙の「50位圏内の難しさ」はいかほどか?(23:20更新)
PDF
「MVが3人な曲の一覧」って取得できます?(デレステ・ミリシタ・エムステ)
PDF
配列の要素挿入・削除もランダムアクセスも両方高速にできる?
PDF
PCSじゃないよ、PCAだよ
PDF
声優やぞ!~シンデレラガールズにおける配役の歴史のRDFデータ化~
PDF
スマホ音楽ゲームの動画から譜面をデータ化したかった
PDF
シンデレラガールズ声優の増え方まとめ
PDF
札幌C++勉強会 #13「最近、仕事でC++11以降の新規格が役に立ったシーン紹介」
PDF
わんくま同盟 名古屋勉強会 #43 ライトニングトーク「Firefoxがver.57~(Quantum)にアップグレードされて困ったこと・やったこと」
PDF
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
PDF
最近デレステ創作譜面作ってるので技術的な見地から話します
PDF
デレステの劇場で登場したアイドルの回数の統計取ってます
PDF
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
PDF
名古屋市営地下鉄最小距離完乗
PDF
MSYS2使いはじめました
PDF
関数の最小値を求めることから機械学習へ
シンデレラガールズの「シンプルな」カードゲームを作りたい(アイマスハッカソン2024)
pandas便利だけどデフォルトパラメータでファイルを読み込むな!
式を書くだけで最適化計算してほしい!~CVXPY編~
旅行「#重複乗車禁止で名鉄完乗」とその数学的な解説
シンデレラガール総選挙の「50位圏内の難しさ」はいかほどか?(23:20更新)
「MVが3人な曲の一覧」って取得できます?(デレステ・ミリシタ・エムステ)
配列の要素挿入・削除もランダムアクセスも両方高速にできる?
PCSじゃないよ、PCAだよ
声優やぞ!~シンデレラガールズにおける配役の歴史のRDFデータ化~
スマホ音楽ゲームの動画から譜面をデータ化したかった
シンデレラガールズ声優の増え方まとめ
札幌C++勉強会 #13「最近、仕事でC++11以降の新規格が役に立ったシーン紹介」
わんくま同盟 名古屋勉強会 #43 ライトニングトーク「Firefoxがver.57~(Quantum)にアップグレードされて困ったこと・やったこと」
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
最近デレステ創作譜面作ってるので技術的な見地から話します
デレステの劇場で登場したアイドルの回数の統計取ってます
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
名古屋市営地下鉄最小距離完乗
MSYS2使いはじめました
関数の最小値を求めることから機械学習へ

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