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

37
Sapporo.cpp 第7回勉強会(2014.10.18) STLの型の使い分け (ダイジェスト版) H.Hiro Twitter: @h_hiro_ http://hhiro.net/about/

Upload: hiro-h

Post on 02-Jul-2015

686 views

Category:

Technology


7 download

DESCRIPTION

C++におけるSTLの型の使い分けについて書いた記事(http://qiita.com/h_hiro_/items/a83a8fd2391d4a3f0e1c)をダイジェストで解説するものです。

TRANSCRIPT

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

Sapporo.cpp 第7回勉強会(2014.10.18)

STLの型の使い分け(ダイジェスト版)

H.HiroTwitter: @h_hiro_

http://hhiro.net/about/

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

自己紹介

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

H.Hiro●情報系の研究員やってます●趣味でもプログラム書いてます●最近は研究でも趣味でも手間のかかるアルゴリズムの実装をよくやってます

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

最近の制作物●JRなどの路線網を与えて「最短距離で全線乗り尽くす」乗り方を求める(C++)blog.livedoor.jp/maraigue/archives/1747895.html

函館

五稜郭

中小国

大沼

長万部

室蘭東室蘭

苫小牧

沼ノ端追分

新得夕張

新夕張

東釧路

根室南千歳

新千歳空港

桑園 白石

新十津川

増毛

滝川

深川

旭川 新旭川

稚内

富良野

様似

岩見沢

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

最近の制作物●単語一覧から最大単語数のしりとりを求める(Ruby)chiraura.hhiro.net/shiritori/

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

よろしくお願いします

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

今回話す内容

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

STL の型の使い分け - qiitahttp://qiita.com/h_hiro_/items/a83a8fd2391d4a3f0e1c●ここに書いてない基本的な考え方+ここに書いた内容の要点をお話しします●上記記事は、詳細な使い分けを実際に検討するためにご利用いただければと思います

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

今回のテーマ

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

STL

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

STLとは●Standard Template Libraryの略●汎用的、かつ型に依存しないデータ構造や処理(アルゴリズム)を提供する

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

STLとは●Standard Template Libraryの略●汎用的、かつ型に依存しないデータ構造や処理(アルゴリズム)を提供する

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

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); // 型を明示してもよい

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

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

}

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

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バイト

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

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バイト

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

●汎用的に利用されるデータ構造やアルゴリズムを自前で作るのはミス・バグの原因にもなる●STLが提供する機能の特性を理解したうえで、先人の力を借りよう●複数人で開発するときとかは特に。(標準ライブラリなので何かと便利!)

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

●汎用的に利用されるデータ構造やアルゴリズムを自前で作るのはミス・バグの原因にもなる●STLが提供する機能の特性を理解したうえで、先人の力を借りよう●複数人で開発するときとかは特に。(標準ライブラリなので何かと便利!)それもまた

なかなか大変なので今回解説するわけですが

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

STLの型

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

STLではいろいろな型(クラス)が定義されている

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

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バイト

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

「可変長配列」とか「連想配列」とか

汎用的なデータ構造が多数用意されている

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

ここでは「可変長配列」を

使ったけど

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

似た用途で使える型が

STLには他に2つ存在する

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

std::vector<int> hoge = {3, 1, 4};std::deque<int> hoge = {3, 1, 4};std::list<int> hoge = {3, 1, 4};

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

●どれも「要素を指定された順番に格納する」という点では共通●ただし、内部の実装が異なる。←得意/不得意な処理が それぞれあるため。

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

deque:固定サイズの連続メモリ領域を複数確保して格納

vector:連続メモリ領域に格納

list:ポインタで繋いで格納(連結リスト)

4バイト 4バイト 4バイト

3 1 4 1 5 …

4バイト 4バイト

3 1 4

1 5 9

3Start前 次

1前 次

4前 次

End前次

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

vector: 連続メモリ領域に格納→「●番目の要素を得る」(ランダムアクセス) が高速 (メモリ上のアドレスがすぐに分かる)→メモリ量も少ない(詰めているため)→要素挿入・削除に弱い0x8720

4バイト 4バイト

3 1 4 1 5

4バイト 4バイト4バイト

0x87240x8728

0x872C0x8730

3 4 1 5

後ろ全部を移動の必要あり3 1 4 1 5 …

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

deque: 固定サイズの連続メモリ領域を複数確保して格納

→vectorに似るが、先頭・末尾への挿入・削除には強い

3 1 4

1 5 9

3 1 4

1 5 9

2

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

list: ポインタで繋いで格納→挿入・削除には途中であっても強い→ランダムアクセスは低速(順に辿るため) 演算子 "[]" は定義されていない

→メモリもvectorなどに比べれば多く必要 要素1つにつきポインタ変数が2つぶん必要

3Start前 次

1前 次

4前 次

End前次

5前 次

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

list: ポインタで繋いで格納→挿入・削除には途中であっても強い→ランダムアクセスは低速(順に辿るため) 演算子 "[]" は定義されていない

→メモリもvectorなどに比べれば多く必要 要素1つにつきポインタ変数が2つぶん必要

3Start前 次

1前 次

4前 次

End前次

5前 次

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

本当に一長一短

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

「ランダムアクセス」「挿入・削除」

両方無条件に有利という型は存在しないほかに「検索」や「メモリ効率」

などの話もある

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

"Effective STL"より引用●コンテナの任意の位置に新しい要素を挿入する必要があるか?(あるならlistが有利だが、メモリを食う)●要素がコンテナ内でどのように並ぶかが問題となるか?(気にしないなら連想配列が使える)●どのイテレータが使える必要があるか?(ランダムアクセスの可否など)etc.

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

どのデータ構造を使うと高速なのか/メモリ消費が少ないのか詳しくはこの記事で!(再掲)

STLの型の使い分け - qiitahttp://qiita.com/h_hiro_/items/a83a8fd2391d4a3f0e1c

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

STLの型の特性を知ってより快適な

C++ライフを!

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

Sapporo.cpp 第7回勉強会(2014.10.18)

C++のSTLのコンテナ型を概観する

終わり