Sapporo.cpp 第7回勉強会(2014.10.18) 
STLの型の使い分け 
(ダイジェスト版) 
H.Hiro 
Twitter: @h_hiro_ 
http://hhiro.net/about/
自己紹介
H.Hiro 
●情報系の研究員 
やってます 
●趣味でもプログラム書いてます 
●最近は研究でも趣味でも 
手間のかかるアルゴリズムの 
実装をよくやってます
最近の制作物 
●JRなどの路線網を与えて 
「最短距離で全線乗り尽くす」 
乗り方を求める(C++) 
blog.livedoor.jp/maraigue/archives/1747895.html 
増毛 
新十津川 
苫小牧 
滝川 
東室蘭 
五稜郭 
函館 
長万部 
森 
大沼 
中小国 
室蘭 
追分 
沼ノ端 
稚内 
東釧路 
新得 
夕張 
新夕張 
根室 
南千歳 
新千歳空港 
桑園白石 
深川 
旭川新旭川 
富良野 
様似 
岩見沢
最近の制作物 
●単語一覧から最大単語数の 
しりとりを求める(Ruby) 
chiraura.hhiro.net/shiritori/
よろしく 
お願いします
今回話す内容
STL の型の使い分け - qiita 
http://qiita.com/h_hiro_/ 
items/a83a8fd2391d4a3f0e1c 
●ここに書いてない基本的な考え方+ 
ここに書いた内容の要点をお話しします 
●上記記事は、詳細な使い分けを 
実際に検討するために 
ご利用いただければと思います
今回のテーマ
STL
STLとは 
●Standard Template Libraryの略 
●汎用的、かつ型に依存しない 
データ構造や処理(アルゴリズム) 
を提供する
STLとは 
●Standard Template Libraryの略 
●汎用的、かつ型に依存しない 
データ構造や処理(アルゴリズム) 
を提供する
Template(テンプレート)とは 
●コンパイル時に有効になる 
クラスや関数に対するパラメータ 
●型によらない機能を提供するのが 
代表的な用法 
template <class TYPE> 
TYPE max(const TYPE & v1, const TYPE & v2){ 
return(v1 > v2 ? v1 : v2); 
} 
max(1.0, 3.0); // TYPEはfloatとみなされる 
max(1, 5); // TYPEはintとみなされる 
max<int>(1, 5); // 型を明示してもよい
STLの例 
#include <iostream> 
#include <vector> 
#include <algorithm> 
int main(void){ 
// 「intのvector」「doubleのvector」を作る 
// (あとで説明しますが、可変長配列です) 
std::vector<int> hoge = {3, 1, 4}; 
std::vector<double> piyo = {5.6, 1.2, 3.4}; 
// int/doubleの型によらず、同じ記法でソート(並べ替え)できる 
std::sort(hoge.begin(), hoge.end()); 
std::sort(piyo.begin(), piyo.end()); 
}
STLの例 
#include <iostream> 
#include <vector> 
#include <algorithm> 
int main(void){ 
// 「intのvector」「doubleのvector」を作る 
// (あとで説明しますが、可変長配列です) 
std::vector<int> hoge = {3, 1, 4}; 
std::vector<double> piyo = {5.6, 1.2, 3.4}; 
// int/doubleの型によらず、同じ記法でソート(並べ替え)できる 
std::sort(hoge.begin(), hoge.end()); 
std::sort(piyo.begin(), piyo.end()); 
} 
※バイト数は 
一例です 
3 1 4 
4バイト4バイト4バイト
STLの例 
#include <iostream> 
#include <vector> 
#include <algorithm> 
int main(void){ 
// 「intのvector」「doubleのvector」を作る 
// (あとで説明しますが、可変長配列です) 
std::vector<int> hoge = {3, 1, 4}; 
std::vector<double> piyo = {5.6, 1.2, 3.4}; 
// int/doubleの型によらず、同じ記法でソート(並べ替え)できる 
std::sort(hoge.begin(), hoge.end()); 
std::sort(piyo.begin(), piyo.end()); 
} 
5.6 1.2 3.4 
8バイト8バイト8バイト
●汎用的に利用されるデータ構造や 
アルゴリズムを自前で作るのは 
ミス・バグの原因にもなる 
● STLが提供する機能の特性を 
理解したうえで、先人の力を借りよう 
●複数人で開発するときとかは特に。 
(標準ライブラリなので何かと便利!)
●汎用的に利用されるデータ構造や 
アルゴリズムを自前で作るのは 
ミス・バグの原因にもなる 
● STLが提供する機能の特性を 
理解したうえで、先人の力を借りよう 
●複数人で開発するときとかは特に。 
(標準ライブラリなそのれでもま何たかと便利!) 
なかなか大変なので 
今回解説するわけですが
STLの型
STLでは 
いろいろな型(クラス) 
が定義されている
STLの例(再掲) 
#include <iostream> 
#include <vector> 
#include <algorithm> 
int main(void){ 
// 「intのvector」「doubleのvector」を作る 
// (あとで説明しますが、可変長配列です) 
std::vector<int> hoge = {3, 1, 4}; 
std::vector<double> piyo = {5.6, 1.2, 3.4}; 
// int/doubleの型によらず、同じ記法でソート(並べ替え)できる 
std::sort(hoge.begin(), hoge.end()); 
std::sort(piyo.begin(), piyo.end()); 
} 
3 1 4 
4バイト4バイト4バイト 
5.6 1.2 3.4 
8バイト8バイト8バイト
「可変長配列」とか 
「連想配列」とか 
汎用的なデータ構造が 
多数用意されている
ここでは 
「可変長配列」を 
使ったけど
似た用途で 
使える型が 
STLには他に2つ 
存在する
std::vector<int> hoge = {3, 1, 4}; 
std::deque<int> hoge = {3, 1, 4}; 
std::list<int> hoge = {3, 1, 4};
●どれも「要素を指定された 
順番に格納する」という 
点では共通 
●ただし、内部の実装が異なる。 
←得意/不得意な処理が 
 それぞれあるため。
vector: 
連続メモリ領域に格納 
deque: 
固定サイズの 
連続メモリ領域を 
複数確保して格納 
list: 
ポインタで 
繋いで格納 
(連結リスト) 
⋮ 
3 1 4 1 5 … 
4バイト4バイト4バイト 
4バイト4バイト 
3 1 4 
1 5 9 
Start 3 
前次 
1 
前次 
4 
前次 
End 
次前
vector: 連続メモリ領域に格納 
→「●番目の要素を得る」(ランダムアクセス) 
 が高速 
 (メモリ上のアドレスがすぐに分かる) 
→メモリ量も少ない(詰めているため) 
→要素挿入・削除に弱い 
0x8720 
0x8724 
0x8728 
0x872C 
4バイト4バイト 
3 1 4 1 5 
0x8730 
4バイト4バイト4バイト 
後ろ全部を移動の必要あり 
3 4 1 5 
3 1 4 1 5 …
deque: 固定サイズの連続メモリ領域を 
複数確保して格納 
→vectorに似るが、 
先頭・末尾への挿入・削除には強い 
⋮ 
3 1 4 
1 5 9 
3 1 4 
1 5 9 
2
list: ポインタで繋いで格納 
→挿入・削除には途中であっても強い 
→ランダムアクセスは低速(順に辿るため) 
 演算子 "[]" は定義されていない 
→メモリもvectorなどに比べれば多く必要 
 要素1つにつきポインタ変数が2つぶん必要 
Start 3 
前次 
1 
前次 
4 
前次 
End 
次前 
5 
前次
list: ポインタで繋いで格納 
→挿入・削除には途中であっても強い 
→ランダムアクセスは低速(順に辿るため) 
 演算子 "[]" は定義されていない 
→メモリもvectorなどに比べれば多く必要 
 要素1つにつきポインタ変数が2つぶん必要 
Start 3 
前次 
1 
前次 
4 
前次 
End 
次前 
5 
前次
本当に一長一短
「ランダムアクセス」 
「挿入・削除」 
両方無条件に有利と 
いう型は存在しない 
ほかに「検索」や「メモリ効率」 
などの話もある
"Effective STL"より引用 
●コンテナの任意の位置に新しい要素を 
挿入する必要があるか? 
(あるならlistが有利だが、メモリを食う) 
●要素がコンテナ内でどのように並ぶかが 
問題となるか? 
(気にしないなら連想配列が使える) 
●どのイテレータが使える必要があるか? 
(ランダムアクセスの可否など) 
etc.
どのデータ構造を使うと 
高速なのか/メモリ消費が少ないのか 
詳しくはこの記事で!(再掲) 
STLの型の使い分け - qiita 
http://qiita.com/h_hiro_/ 
items/a83a8fd2391d4a3f0e1c
STLの型の 
特性を知って 
より快適な 
C++ライフを!
Sapporo.cpp 第7回勉強会(2014.10.18) 
C++のSTLの 
コンテナ型を概観する 
終わり

STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)