あめだまふぁくとりー

Boost.Graphとかできますん

property_map_iterator…だと…?

make_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とかはじめて使った…