Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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 &...
STLの例 
#include <iostream> 
#include <vector> 
#include <algorithm> 
int main(void){ 
// 「intのvector」「doubleのvector」を作る 
/...
STLの例 
#include <iostream> 
#include <vector> 
#include <algorithm> 
int main(void){ 
// 「intのvector」「doubleのvector」を作る 
/...
STLの例 
#include <iostream> 
#include <vector> 
#include <algorithm> 
int main(void){ 
// 「intのvector」「doubleのvector」を作る 
/...
●汎用的に利用されるデータ構造や 
アルゴリズムを自前で作るのは 
ミス・バグの原因にもなる 
● STLが提供する機能の特性を 
理解したうえで、先人の力を借りよう 
●複数人で開発するときとかは特に。 
(標準ライブラリなので何かと便利!)
●汎用的に利用されるデータ構造や 
アルゴリズムを自前で作るのは 
ミス・バグの原因にもなる 
● STLが提供する機能の特性を 
理解したうえで、先人の力を借りよう 
●複数人で開発するときとかは特に。 
(標準ライブラリなそのれでもま何たか...
STLの型
STLでは 
いろいろな型(クラス) 
が定義されている
STLの例(再掲) 
#include <iostream> 
#include <vector> 
#include <algorithm> 
int main(void){ 
// 「intのvector」「doubleのvector」を作...
「可変長配列」とか 
「連想配列」とか 
汎用的なデータ構造が 
多数用意されている
ここでは 
「可変長配列」を 
使ったけど
似た用途で 
使える型が 
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...
vector: 連続メモリ領域に格納 
→「●番目の要素を得る」(ランダムアクセス) 
 が高速 
 (メモリ上のアドレスがすぐに分かる) 
→メモリ量も少ない(詰めているため) 
→要素挿入・削除に弱い 
0x8720 
0x8724 
0x...
deque: 固定サイズの連続メモリ領域を 
複数確保して格納 
→vectorに似るが、 
先頭・末尾への挿入・削除には強い 
⋮ 
3 1 4 
1 5 9 
3 1 4 
1 5 9 
2
list: ポインタで繋いで格納 
→挿入・削除には途中であっても強い 
→ランダムアクセスは低速(順に辿るため) 
 演算子 "[]" は定義されていない 
→メモリもvectorなどに比べれば多く必要 
 要素1つにつきポインタ変数が2つぶ...
list: ポインタで繋いで格納 
→挿入・削除には途中であっても強い 
→ランダムアクセスは低速(順に辿るため) 
 演算子 "[]" は定義されていない 
→メモリもvectorなどに比べれば多く必要 
 要素1つにつきポインタ変数が2つぶ...
本当に一長一短
「ランダムアクセス」 
「挿入・削除」 
両方無条件に有利と 
いう型は存在しない 
ほかに「検索」や「メモリ効率」 
などの話もある
"Effective STL"より引用 
●コンテナの任意の位置に新しい要素を 
挿入する必要があるか? 
(あるならlistが有利だが、メモリを食う) 
●要素がコンテナ内でどのように並ぶかが 
問題となるか? 
(気にしないなら連想配列が使...
どのデータ構造を使うと 
高速なのか/メモリ消費が少ないのか 
詳しくはこの記事で!(再掲) 
STLの型の使い分け - qiita 
http://qiita.com/h_hiro_/ 
items/a83a8fd2391d4a3f0e1c
STLの型の 
特性を知って 
より快適な 
C++ライフを!
Sapporo.cpp 第7回勉強会(2014.10.18) 
C++のSTLの 
コンテナ型を概観する 
終わり
Upcoming SlideShare
Loading in …5
×

3

Share

Download to read offline

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

Download to read offline

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

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

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

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

    Mar. 10, 2019
  • TsuyoshiCHO1

    Jun. 26, 2016
  • torufujino

    Sep. 15, 2015

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

Views

Total views

3,135

On Slideshare

0

From embeds

0

Number of embeds

541

Actions

Downloads

21

Shares

0

Comments

0

Likes

3

×