Boost.PropertyMap (.pptx)
-
Upload
cryolite -
Category
Technology
-
view
1.473 -
download
1
Transcript of Boost.PropertyMap (.pptx)
![Page 1: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/1.jpg)
1
2010/10/23 Cryolite
Boost.勉強会 #3 関西
S t a
T
L
a
a
a
e m
n d dr
rri b
p l t e
y
![Page 2: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/2.jpg)
自己紹介
• 名前: Cryolite
• 特技: C++ とかできます
2
![Page 3: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/3.jpg)
STLとは「コンテナ×イテレータ×アルゴリズム」
3
コンテナ アルゴリズム
findsortremove・・・・・
vectordequelist・・・・・
![Page 4: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/4.jpg)
STLとは「コンテナ×イテレータ×アルゴリズム」
4
コンテナ アルゴリズム
findsortremove・・・・・
vectordequelist・・・・・
![Page 5: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/5.jpg)
STLとは「コンテナ×イテレータ×アルゴリズム」
5
コンテナ アルゴリズム
findsortremove・・・・・
vectordequelist・・・・・
(組み合わせの数)
=(データ構造の数)×(アルゴリズムの数)かける
![Page 6: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/6.jpg)
STLとは「コンテナ×イテレータ×アルゴリズム」
コンテナ アルゴリズム
findsortremove・・・・・
vectordequelist・・・・・
イテレータ
6
![Page 7: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/7.jpg)
STLとは「コンテナ×イテレータ×アルゴリズム」
コンテナ アルゴリズム
findsortremove・・・・・
vectordequelist・・・・・
イテレータ
(組み合わせの数)
=(データ構造の数)+(アルゴリズムの数)たす
7
![Page 8: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/8.jpg)
STLとは「コンテナ×イテレータ×アルゴリズム」
コンテナ アルゴリズム
findvectordeque イテレータ
8
![Page 9: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/9.jpg)
STLとは「コンテナ×イテレータ×アルゴリズム」
コンテナ アルゴリズム
findvectordeque イテレータ
コンテナ側に変化があっても……
9
![Page 10: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/10.jpg)
STLとは「コンテナ×イテレータ×アルゴリズム」
コンテナ アルゴリズム
findvectordeque イテレータ
コンテナ側に変化があっても……
アルゴリズム側に影響しない
10
![Page 11: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/11.jpg)
STLとは「コンテナ×イテレータ×アルゴリズム」
コンテナ アルゴリズム
findvectordeque イテレータ
コンテナ側に変化があっても……
アルゴリズム側に影響しない
コンテナ側の変化に対するファイアウォール 11
![Page 12: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/12.jpg)
イテレータに注目!
コンテナ アルゴリズム
findsortremove・・・・・
vectordequelist・・・・・
イテレータ
ちうもく!!12
![Page 13: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/13.jpg)
コンテナのイテレータには3つの機能がある!
13
![Page 14: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/14.jpg)
コンテナのイテレータは
• コンテナ中の場所(コンテナ中の1要素)を指し示す
14
//同じ場所なら trueだよ!iter == jter;
![Page 15: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/15.jpg)
コンテナのイテレータは
• コンテナ中の場所(コンテナ中の1要素)を指し示す
• コンテナ中の全要素を列挙する
15
//同じ場所なら trueだよ!iter == jter;
//次の場所に移動するよ!//繰り返せば列挙になるよ!++iter;
![Page 16: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/16.jpg)
コンテナのイテレータは
• コンテナ中の場所(コンテナ中の1要素)を指し示す
• コンテナ中の全要素を列挙する
•指し示している場所の値を取り出せる
16
//同じ場所なら trueだよ!iter == jter;
//次の場所に移動するよ!//繰り返せば列挙になるよ!++iter;
//あたいったら取り出すね!*iter;
![Page 17: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/17.jpg)
イテレータの3つの機能(※イメージです)
17
2 3 5 7 11 13 17 ・・・
コンテナ
![Page 18: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/18.jpg)
イテレータの3つの機能(※イメージです)
18
2 3 5 7 11 13 17 ・・・
場所を指示
コンテナ
![Page 19: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/19.jpg)
イテレータの3つの機能(※イメージです)
19
2 3 5 7 11 13 17 ・・・
列挙する場所を指示
コンテナ
![Page 20: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/20.jpg)
イテレータの3つの機能(※イメージです)
20
2 3 5 7 11 13 17 ・・・
5値を取り出す
列挙する場所を指示
コンテナ
![Page 21: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/21.jpg)
STL 最大の欠点– Cryoliteの眼: C++pro
21
Inspired by http://itpro.nikkeibp.co.jp/article/Watcher/20101015/352993/
![Page 22: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/22.jpg)
STL 最大の欠点– Cryoliteの眼: C++pro
配列†のインデックスを再評価してもいいのでは?
22
Inspired by http://itpro.nikkeibp.co.jp/article/Watcher/20101015/352993/
![Page 23: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/23.jpg)
STL 最大の欠点– Cryoliteの眼: C++pro
23
配列†のインデックスを再評価してもいいのでは?
筆者がここで言いたいのは,そろそろ配列†のインデックスを使ってみてもいいのでは?ということだ.
†一般にはランダムアクセスコンテナ
Inspired by http://itpro.nikkeibp.co.jp/article/Watcher/20101015/352993/
![Page 24: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/24.jpg)
24
温故知新–故きを温ね新しきを知る
![Page 25: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/25.jpg)
25
古代暗黒魔法が封印された禁書を開いてみると,そこには古代語で書かれたプログラムとおぼしきものが!
温故知新–故きを温ね新しきを知る
![Page 26: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/26.jpg)
26
古代暗黒魔法が封印された禁書を開いてみると,そこには古代語で書かれたプログラムとおぼしきものが!
vector<int> v;.....for (size_t i = 0; i != v.size(); ++i) {cout << v[i] << endl;
}
温故知新–故きを温ね新しきを知る
![Page 27: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/27.jpg)
27
古代暗黒魔法が封印された禁書を開いてみると,そこには古代語で書かれたプログラムとおぼしきものが!
vector<int> v;.....for (size_t i = 0; i != v.size(); ++i) {cout << v[i] << endl;
}
温故知新–故きを温ね新しきを知る
ランダムアクセスコンテナならイテレータを使わなくてもインデックスで要素を列挙できるもんっ!
![Page 28: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/28.jpg)
• コンテナ中の場所を指し示す
• コンテナ中の全要素を列挙する
•指し示している場所の値を取り出せる
28
//同じ場所なら trueだよ!iter == jter;
//次の場所に移動するよ!//繰り返せば列挙になるよ!++iter;
//あたいったら取り出すね!*iter;
イテレータの機能を思い出してみよう!
![Page 29: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/29.jpg)
29
ランダムアクセスコンテナのインデックスは……
![Page 30: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/30.jpg)
• コンテナ中の場所を指し示す
30
//同じ場所なら trueだよ!i == j;
ランダムアクセスコンテナのインデックスは……
![Page 31: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/31.jpg)
• コンテナ中の場所を指し示す
• コンテナ中の全要素を列挙する
31
//同じ場所なら trueだよ!i == j;
//次の場所に移動するよ!//繰り返せば列挙になるよ!++i;
ランダムアクセスコンテナのインデックスは……
![Page 32: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/32.jpg)
• コンテナ中の場所を指し示す
• コンテナ中の全要素を列挙する
•指し示している場所の値を取り出せ……る?
32
//同じ場所なら trueだよ!i == j;
//次の場所に移動するよ!//繰り返せば列挙になるよ!++i;
// コ,コンテナオブジェクトさえあれば!v[i];
ランダムアクセスコンテナのインデックスは……
![Page 33: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/33.jpg)
値の取り出し方を抽象化しましょう← 結論
33
![Page 34: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/34.jpg)
値の取り出し方を抽象化しましょう← 結論
34
イテレータもインデックスもコンテナ中の場所を指し示せる
![Page 35: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/35.jpg)
値の取り出し方を抽象化しましょう← 結論
35
v[i];
イテレータもインデックスもコンテナ中の場所を指し示せる
*iter;
値を取り出す構文が違う
![Page 36: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/36.jpg)
値の取り出し方を抽象化しましょう← 結論
36
v[i];
イテレータもインデックスもコンテナ中の場所を指し示せる
*iter;
値の取り出し方を抽象化しましょう
値を取り出す構文が違う
get(pm, desc);
![Page 37: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/37.jpg)
値の取り出し方を抽象化しましょう← 結論
37
v[i];
イテレータもインデックスもコンテナ中の場所を指し示せる
*iter;
値の取り出し方を抽象化しましょう
値を取り出す構文が違う
get(pm, desc);
イテレータだったりインデックスだったり
![Page 38: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/38.jpg)
【再掲】イテレータの機能(イメージ)
38
2 3 5 7 11 13 17 ・・・
5値を取り出す
列挙する場所を指示
コンテナ
![Page 39: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/39.jpg)
値の取り出し方を抽象化したイメージへ……
・・・
モノの集まり
39
![Page 40: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/40.jpg)
・・・
1つのモノを指示
モノの集まり
40
値の取り出し方を抽象化したイメージへ……
![Page 41: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/41.jpg)
・・・
列挙する1つのモノを指示
モノの集まり
41
値の取り出し方を抽象化したイメージへ……
![Page 42: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/42.jpg)
・・・
5
列挙する1つのモノを指示
モノの集まり
32 7モノと値を関連付ける
11 13 1942
値の取り出し方を抽象化したイメージへ……
![Page 43: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/43.jpg)
疑問
・・・
5
列挙する1つのモノを指示
モノの集まり
32 7モノと値を関連付ける
11 13 19
こんな風に考えて何がうれしいの?
43
![Page 44: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/44.jpg)
疑問への回答その1
・・・
5
列挙する1つのモノを指示
モノの集まり
32 7モノと値を関連付ける
11 13 19
こんな風に考えて何がうれしいの?
44
モノの指し示し方を柔軟にできるよ!イテレータ,インデックス, etc…
![Page 45: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/45.jpg)
・・・
5
列挙する1つのモノを指示
モノの集まり
32 7モノと値を関連付ける
11 13 19
こんな風に考えて何がうれしいの?
45
モノに対して柔軟に値を関連付けられるよ!
疑問への回答その2
![Page 46: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/46.jpg)
・・・
1
モノの集まり
11 1
定数を関連付ける
1 1 146
疑問への回答その2 (例1)
![Page 47: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/47.jpg)
・・・
モノの集まり
3×22×2 7×2 11×2 13×2 19×247
5×2
値を加工して関連付ける
疑問への回答その2 (例2)
![Page 48: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/48.jpg)
・・・
5
列挙する1つのモノを指示
モノの集まり
32 7モノと値を関連付ける
11 13 19
こんな風に考えて何がうれしいの?
1つのモノに対して複数の値を関連付けられるよ!
48
疑問への回答その3
![Page 49: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/49.jpg)
・・・
49
疑問への回答その3 (例)
![Page 50: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/50.jpg)
・・・
532 7 11 13 19
モノと値を関連付けその1
50
疑問への回答その3 (例)
![Page 51: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/51.jpg)
・・・
532 7 11 13 19
‘H’ ‘e’ ‘l’ ‘l’ ‘o’ ‘,’ ‘_’
モノと値を関連付けその1
モノと値を関連付けその2
51
疑問への回答その3 (例)
![Page 52: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/52.jpg)
それぞれの機能を担うオブジェクトに名前を付けよう!
・・・
5
列挙する1つのモノを指示
モノの集まり
32 7モノと値を関連付ける
11 13 1952
![Page 53: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/53.jpg)
・・・
5
列挙する
モノの集まり
32 7モノと値を関連付ける
11 13 1953
デスクリプタ
それぞれの機能を担うオブジェクトに名前を付けよう!
![Page 54: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/54.jpg)
・・・
5
モノの集まり
32 7モノと値を関連付ける
11 13 1954
デスクリプタ (デスクリプタを列挙する)
イテレータ
それぞれの機能を担うオブジェクトに名前を付けよう!
![Page 55: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/55.jpg)
・・・
5
モノの集まり
32 7プロパティマップ
11 13 1955
デスクリプタ (デスクリプタを列挙する)
イテレータ
それぞれの機能を担うオブジェクトに名前を付けよう!
![Page 56: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/56.jpg)
56
Boost.PropertyMap
2010/10/23 Cryolite
Boost.勉強会 #3 関西
![Page 57: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/57.jpg)
プロパティマップとは
57
デスクリプタを受け取って,値を返すインタフェイスを定義
デスクリプタと書き込む値を受け取って,書き込むインタフェイスを定義
get(pm, desc); // 値が返る
put(pm, desc, val);
![Page 58: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/58.jpg)
プロパティマップとは
• イテレータにおける「値を取り出す」「値を書き込む」機能に対応
• うれしいこと3つ
– モノの指し示し方が超柔軟に
– モノに関連付けられた値の取り出し方・書き込み方が超柔軟に
– 1つのモノに対して複数の値・書き込み先を関連付ける
58
![Page 59: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/59.jpg)
プロパティマップとは
59
このライブラリだけ説明しても意味不明!
STL のコンテナとアルゴリズムの関係を話さずにイテレータを説明してもおそらく意味不明!
≒
![Page 60: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/60.jpg)
イテレータ in STL
60
コンテナ アルゴリズム
findsortremove・・・・・
vectordequelist・・・・・
イテレータ
![Page 61: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/61.jpg)
プロパティマップin 汎用グラフライブラリ
61
グラフデータ構造
汎用グラフアルゴリズム
DijkstraDFSA*・・・・・
隣接リスト隣接行列edge list・・・・・
イテレータ
デスクリプタ
プロパティマップ
ビジター
![Page 62: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/62.jpg)
プロパティマップin 汎用グラフライブラリ
62
グラフデータ構造
汎用グラフアルゴリズム
DijkstraDFSA*・・・・・
隣接リスト隣接行列edge list・・・・・
イテレータ
デスクリプタ
プロパティマップ
ビジター
![Page 63: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/63.jpg)
Boost.PropertyMapの本領–グラフにおける汎用アルゴリズム
63
ab
c
d
e
f
![Page 64: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/64.jpg)
グラフのデータ構造とプロパティマップ-グラフのデータ構造は多種多様
64
a
b
c
d
e
f
a b d g
b c d
a c f
a c g
b f
c d e
隣接リスト (例1)
![Page 65: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/65.jpg)
グラフのデータ構造とプロパティマップ-グラフのデータ構造は多種多様
65
a
b
c
d
e
f
a b d g
b c d
a c f
a c g
b f
c d e
隣接リスト (例2)
![Page 66: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/66.jpg)
グラフのデータ構造とプロパティマップ-グラフのデータ構造は多種多様
66隣接行列
0 1 1 1 0 0
1 0 1 0 1 0
1 1 0 1 0 1
1 0 1 0 0 1
0 1 0 0 0 1
0 0 1 1 1 0
a b c d e fabcde
f
![Page 67: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/67.jpg)
グラフアルゴリズムは頂点や辺に関連付けられた値を駆使
67
グラフアルゴリズムは
• 頂点の重み,インデックス,親,色
• スタートから各頂点までの距離
• 辺の重み,インデックス
• 辺のインデックス
などを使わないと実行できない
色々なグラフデータ構造に対してこれらをどう関連付けるのか?
![Page 68: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/68.jpg)
デスクリプタ・イテレータ・プロパティマップによる汎用なグラフアルゴリズム
68
⇒(デスクリプタを返す) イテレータを使います
頂点や辺を一意に特定する必要があります
頂点や辺に様々な値を関連付ける必要があります
頂点や辺を様々な形で列挙する必要があります
⇒頂点や辺を指すデスクリプタを使います
⇒プロパティマップを使います
![Page 69: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/69.jpg)
具体的な例 – ランダムアクセスコンテナ & イテレータ
69
vector<Edge>
struct Edge {double getWeight() const;void setWeight(double w);
};
double get(WeightPMap, Iterator iter) {return iter->getWeight();
}
辺の重みの読み出し
iter
![Page 70: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/70.jpg)
具体的な例 – ランダムアクセスコンテナ & イテレータ
70
vector<Edge>
struct Edge {double getWeight() const;void setWeight(double w);
};
void put(WeightPMap, Iterator iter, double val) {iter->setWeight(val);
}
辺の重みの書き込み
iter
![Page 71: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/71.jpg)
具体的な例 – ランダムアクセスコンテナ & イテレータ
71
vector<Edge>
struct IteratorIndexPMap {Iterator first_; // = v.begin()
};
size_t get(IteratorOffsetPMap pm, Iterator iter) {return iter - pm.first_;
} 辺のインデックスの読み出し (read-only)
iter
![Page 72: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/72.jpg)
具体的な例 – ランダムアクセスコンテナ & インデックス
72
vector<Edge>
struct Edge {double getWeight() const;void setWeight(double w);
};
struct WeightPMap { vector<Edge> &v_; };
double get(WeightPMap pm, Index idx) {return pm.v_[idx].getWeight();
}
辺の重みの読み出し
idx
![Page 73: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/73.jpg)
具体的な例 – ランダムアクセスコンテナ & インデックス
73
vector<Edge>
struct Edge {double getWeight() const;void setWeight(double w);
};
struct WeightPMap { vector<Edge> &v_; };
void put(WeightPMap pm, Index idx, double val) {pm.v_[idx].setWeight(val);
}
辺の重みの書き込み
idx
![Page 74: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/74.jpg)
具体的な例 – ランダムアクセスコンテナ & インデックス
74
vector<Edge>
struct IdentityPMap {};
size_t get(IdentityPMap, Index idx) {return idx;
} 辺のインデックスの読み出し (read-only)
idx
![Page 75: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/75.jpg)
様々なプロパティマップの例
75
vector<Edge>
0 1 2 3 4 インデックス
![Page 76: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/76.jpg)
76
vector<Edge>
0 1 2 3 4 インデックス
another_vec[idx]
2 3 5 7 11
様々なプロパティマップの例
![Page 77: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/77.jpg)
vector<Edge>
77
0 1 2 3 4 インデックス
another_vec[idx]
2 3 5 7 11
様々なプロパティマップの例インデックスを踏み台にして,他のランダムアクセスコンテナで別の値をさらに関連付ける
Edge クラスが元々持っていない種類の値を非侵入的に関連付け
![Page 78: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/78.jpg)
78
list<Edge>
double get(WeightPMap, Iterator iter) {return iter->getWeight();
}
void put(WeightPMap, Iterator iter, double val) {iter->setWeight(val);
}
iter
様々なプロパティマップの例
![Page 79: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/79.jpg)
79
list<Edge>
unordered_map<Iterator, double>
2 3 5 7 11
iter
様々なプロパティマップの例
![Page 80: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/80.jpg)
80
list<Edge>
unordered_map<Iterator, size_t>
0 1 2 3 4
iter
インデックス
様々なプロパティマップの例
![Page 81: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/81.jpg)
81
list<Edge>
unordered_map<Iterator, size_t>
0 1 2 3 4
iter
インデックス
2 3 5 7 11
another_vec[idx]
様々なプロパティマップの例
![Page 82: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/82.jpg)
様々なプロパティマップの例
list<Edge>
82
unordered_map<Iterator, size_t>
0 1 2 3 4
iter
インデックス
2 3 5 7 11
another_vec[idx]
実メモリ上に記録したインデックスを踏み台にして,他のランダムアクセスコンテナで別の値をさらに関連付ける
Edge クラスが元々持っていない種類の値を非侵入的に関連付け
![Page 83: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/83.jpg)
プロパティマップin 汎用グラフライブラリ
83
グラフデータ構造
汎用グラフアルゴリズム
プロパティマップget(pm, desc), put(pm, desc, val)
![Page 84: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/84.jpg)
プロパティマップin 汎用グラフライブラリ
84
グラフデータ構造
汎用グラフアルゴリズム
プロパティマップget(pm, desc), put(pm, desc, val)
アルゴリズムはプロパティマップのみに依存どんなデータ構造に対しても
汎用で再利用可能
![Page 85: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/85.jpg)
85
ダイクストラ法で必要なプロパティ種類 Read / Write
頂点 距離 Read & Write
先行頂点 Read & Write
インデックス Read
辺 重み Read
グラフアルゴリズムに対する要求も多種多様
![Page 86: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/86.jpg)
86
ダイクストラ法で必要なプロパティ種類 Read / Write
頂点 距離 Read & Write
先行頂点 Read & Write
インデックス Read
辺 重み Read
ゴールまでの最小の辺の数が知りたいだけなんだけど
グラフアルゴリズムに対する要求も多種多様
辺の重みプロパティマップが定数1を返せばよい
![Page 87: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/87.jpg)
87
ダイクストラ法で必要なプロパティ種類 Read / Write
頂点 距離 Read & Write
先行頂点 Read & Write
インデックス Read
辺 重み Read
ゴールまでの最短距離だけが知りたい実際の経路は別に分からなくてもよいのだが
グラフアルゴリズムに対する要求も多種多様
先行頂点の書き込みプロパティマップに何もしないダミーを設定すればよい
![Page 88: Boost.PropertyMap (.pptx)](https://reader033.fdocument.pub/reader033/viewer/2022052912/55a1acae1a28abd3798b4606/html5/thumbnails/88.jpg)
プロパティマップ –まとめ
• イテレータにおける「値を取り出す」「値を書き込む」機能の抽象インタフェイス定義
• うれしいこと3つ
– モノの指し示し方が超柔軟に
– モノに関連付けられた値の取り出し方・書き込み方が超柔軟に
– 1つのモノに対して複数の値・書き込み先を関連付ける
• 汎用グラフライブラリで威力を発揮 88