stlの型の使い分け(ダイジェスト版) @ sapporo.cpp 第7回勉強会 (2014.10.18)
Post on 02-Jul-2015
686 Views
Preview:
DESCRIPTION
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
函館
五稜郭
中小国
大沼
森
長万部
室蘭東室蘭
苫小牧
沼ノ端追分
新得夕張
新夕張
東釧路
根室南千歳
新千歳空港
桑園 白石
新十津川
増毛
滝川
深川
旭川 新旭川
稚内
富良野
様似
岩見沢
よろしくお願いします
今回話す内容
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