boost::graph グラフコンテナと共に頂点記述子もコピーする

adjacency_listのグラフをコピーする際に注意することがあります。
VertexListにlistSなど指定しているとvertex_descriptorはコピー先で使用できないということです。vecSの場合vertex_descriptorは整数インデックスなので問題ないと思いますが他はポインタのようなものなので使用できません。当たり前の話ですが少し嵌ってしまいました。

そこでコピー元に対応するコピー先のvertex_descriptorをどうやって取得したらいいのかということですが、
copy_graph関数をorig_to_copyパラメータと共に使用します。
これで全ての頂点に対してコピー元とコピー先のvertex_descriptorペアが取得できます。

#include <map>
#include <iostream>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/copy.hpp>
#include <boost/property_map.hpp>
 
using namespace boost;
int main() {
    typedef adjacency_list<listS, listS, directedS> Graph;
    typedef Graph::vertex_descriptor Vertex;
    Graph g(5), h;
 
    typedef std::map<Vertex, Vertex> Map; //結果を格納するコンテナ unordered_mapなどでもよい。
    Map m;
    associative_property_map<Map> pm(m); //associative_property_mapでラップする
    copy_graph(g, h, orig_to_copy(pm)); //グラフをコピーしながら、orig_to_copyで全ての対応するvertex_descriptorペアを取得
 
    for (Map::iterator p = m.begin(); p != m.end(); ++p) {
        std::cout << p->first << " -> " << p->second << std::endl;
    }
}
0x80f0008 -> 0x80f00e0
0x80f0030 -> 0x80f0128
0x80f0058 -> 0x80f0170
0x80f0080 -> 0x80f01b8
0x80f00a8 -> 0x80f0200