property_map_iterator…だと…?
make_iterator_property_map
ランダムアクセスイテレータRAとインデックスマップからRAが指す参照を返すプロパティマップを作る.
名前似すぎだろ…(´Д`)
make_property_map_iteratorはこんな感じ↓で使える.
#include <iostream> #include <iterator> #include <algorithm> #include <functional> #include <numeric> #include <random> #include <boost/graph/adjacency_list.hpp> #include <boost/property_map/property_map_iterator.hpp> int main() { using namespace boost; typedef adjacency_list<vecS, vecS, undirectedS, no_property, property<edge_weight_t, int> > Graph; enum { A, B, C, D, E, F, NumV }; typedef std::pair<int, int> Edge; Edge edge_array[] = { Edge(A, B), Edge(A, D), Edge(A, E), Edge(B, C), Edge(B, D), Edge(B, F), Edge(C, D), Edge(C, F), Edge(D, E), Edge(E, F), Edge(E, F) }; const int NumE = sizeof(edge_array) / sizeof(edge_array[0]); Graph g(edge_array, edge_array + NumE, NumV); property_map<Graph, edge_weight_t>::type weight_map = get(edge_weight, g); // 枝の重みをランダムに割り当てる std::mt19937 eng; std::uniform_int_distribution<int> dist(1, 10); std::generate (make_property_map_iterator(weight_map, edges(g).first), make_property_map_iterator(weight_map, edges(g).second), bind(dist, eng)); // 枝の重みを出力 std::copy (make_property_map_iterator(weight_map, edges(g).first), make_property_map_iterator(weight_map, edges(g).second), std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl; // 枝の重みの総和を出力 std::cout << std::accumulate (make_property_map_iterator(weight_map, edges(g).first), make_property_map_iterator(weight_map, edges(g).second), 0) << std::endl; }
これが使えばid:amedama41:20120110で作ったputを行う関数オブジェクトアダプタもいらないじゃないかヽ(`Д´)ノウワァァァン.でもmake_property_map_iteratorでの代入はLValuePropertyMapコンセプトを満たしたプロパティマップじゃないとできないからLValueじゃないWritableなプロパティマップに対してはあの関数オブジェクトは意味があるんだからね!
randomとかはじめて使った…