Contenu connexe
Similaire à Boost.PropertyMap (.pptx) (20)
Boost.PropertyMap (.pptx)
- 21. STL 最大の欠点
– Cryolite の眼: C++pro
21
Inspired by http://itpro.nikkeibp.co.jp/article/Watcher/20101015/352993/
- 22. STL 最大の欠点
– Cryolite の眼: C++pro
配列†のインデックスを
再評価してもいいのでは?
22
Inspired by http://itpro.nikkeibp.co.jp/article/Watcher/20101015/352993/
- 23. STL 最大の欠点
– Cryolite の眼: C++pro
23
配列†のインデックスを
再評価してもいいのでは?
筆者がここで言いたいのは,
そろそろ配列†のインデック
スを使ってみてもいいので
は?ということだ.
†一般にはランダムアクセスコンテナ
Inspired by http://itpro.nikkeibp.co.jp/article/Watcher/20101015/352993/
- 28. • コンテナ中の場所を指し示す
• コンテナ中の
全要素を列挙する
• 指し示している場所の値を取り出せる
28
// 同じ場所なら true だよ!
iter == jter;
// 次の場所に移動するよ!
// 繰り返せば列挙になるよ!
++iter;
// あたいったら取り出すね!
*iter;
イテレータの機能を
思い出してみよう!
- 32. • コンテナ中の場所を指し示す
• コンテナ中の
全要素を列挙する
• 指し示している場所の値を取り出せ……る?
32
// 同じ場所なら true だよ!
i == j;
// 次の場所に移動するよ!
// 繰り返せば列挙になるよ!
++i;
// コ,コンテナオブジェクトさえあれば!
v[i];
ランダムアクセスコンテナの
インデックスは……
- 51. ・・・
532 7 11 13 19
‘H’ ‘e’ ‘l’ ‘l’ ‘o’ ‘,’ ‘_’
モノと値を関連付けその1
モノと値を関連付けその2
51
疑問への回答その3 (例)
- 69. 具体的な例 – ランダムアク
セスコンテナ & イテレータ
69
vector<Edge>
struct Edge {
double getWeight() const;
void setWeight(double w);
};
double get(WeightPMap, Iterator iter) {
return iter->getWeight();
}
辺の重みの
読み出し
iter
- 70. 具体的な例 – ランダムアク
セスコンテナ & イテレータ
70
vector<Edge>
struct Edge {
double getWeight() const;
void setWeight(double w);
};
void put(WeightPMap, Iterator iter, double val) {
iter->setWeight(val);
}
辺の重みの
書き込み
iter
- 71. 具体的な例 – ランダムアク
セスコンテナ & イテレータ
71
vector<Edge>
struct IteratorIndexPMap {
Iterator first_; // = v.begin()
};
size_t get(IteratorOffsetPMap pm, Iterator iter) {
return iter - pm.first_;
} 辺のインデックスの
読み出し (read-only)
iter
- 72. 具体的な例 – ランダムアク
セスコンテナ & インデックス
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
- 73. 具体的な例 – ランダムアク
セスコンテナ & インデックス
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
- 74. 具体的な例 – ランダムアク
セスコンテナ & インデックス
74
vector<Edge>
struct IdentityPMap {};
size_t get(IdentityPMap, Index idx) {
return idx;
} 辺のインデックスの
読み出し (read-only)
idx
- 77. vector<Edge>
77
0 1 2 3 4 インデックス
another_vec[idx]
2 3 5 7 11
様々なプロパティマップの例インデックスを踏み台にして,
他のランダムアクセスコンテナで
別の値をさらに関連付ける
Edge クラスが元々持っていない
種類の値を非侵入的に関連付け
- 86. 86
ダイクストラ法で必要なプロパティ
種類 Read / Write
頂点 距離 Read & Write
先行頂点 Read & Write
インデックス Read
辺 重み Read
ゴールまでの最小の辺の
数が知りたいだけなんだけど
グラフアルゴリズムに
対する要求も多種多様
辺の重みプロパティマップが
定数1を返せばよい
- 87. 87
ダイクストラ法で必要なプロパティ
種類 Read / Write
頂点 距離 Read & Write
先行頂点 Read & Write
インデックス Read
辺 重み Read
ゴールまでの最短距離だけが知りたい
実際の経路は別に分からなくてもよいのだが
グラフアルゴリズムに
対する要求も多種多様
先行頂点の書き込みプロパティマップに
何もしないダミーを設定すればよい
- 88. プロパティマップ – まとめ
• イテレータにおける「値を取り出す」「値を
書き込む」機能の抽象インタフェイス定義
• うれしいこと3つ
– モノの指し示し方が超柔軟に
– モノに関連付けられた値の取り出し方・書き込
み方が超柔軟に
– 1つのモノに対して複数の値・書き込み先を関
連付ける
• 汎用グラフライブラリで威力を発揮 88