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

Post on 02-Jul-2015

686 Views

Category:

Technology

7 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

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

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

H.HiroTwitter: @h_hiro_

http://hhiro.net/about/

自己紹介

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

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

函館

五稜郭

中小国

大沼

長万部

室蘭東室蘭

苫小牧

沼ノ端追分

新得夕張

新夕張

東釧路

根室南千歳

新千歳空港

桑園 白石

新十津川

増毛

滝川

深川

旭川 新旭川

稚内

富良野

様似

岩見沢

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

よろしくお願いします

今回話す内容

STL の型の使い分け - qiitahttp://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};

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

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

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

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

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

3 1 4 1 5 …

4バイト 4バイト

3 1 4

1 5 9

3Start前 次

1前 次

4前 次

End前次

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

4バイト 4バイト

3 1 4 1 5

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

0x87240x8728

0x872C0x8730

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つぶん必要

3Start前 次

1前 次

4前 次

End前次

5前 次

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

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

3Start前 次

1前 次

4前 次

End前次

5前 次

本当に一長一短

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

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

などの話もある

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

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

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

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

C++ライフを!

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

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

終わり

top related