копирование ребер с их вершинами и свойствами с помощью BOOST

Я хочу скопировать ребра с их вершинами и свойствами из dataG.front() и добавить их в testg , я попробовал то, что нашел в разделе «Доступ к связанным свойствам» http://www.boost.org/doc/libs/1_57_0/libs/graph/doc/bundles.htmlно у меня не работает. PS: dataG - это вектор графиков.

typedef std::pair<edge_iter, edge_iter> edge_pair;
Graph testg;
if (!dataG.empty()) 
{
    auto const& gr = dataG.front();         
    for (edge_pair ep = edges(gr); ep.first != ep.second; ++ep.first) //ep edge number 
    {
        auto ep = edges(gr).first;  // ep edge number

        vertex_t from = source(*ep.first, gr);
        vertex_t to   = target(*ep.first, gr);

        boost::add_vertex(gr[from], testg);
        boost::add_vertex(gr[to], testg);

        boost::add_edge(from, to, gr[*ep.first], testg);

    }
}

свойства edge работают, но есть проблема в источнике и цели. (часть vertex_t и add_vertex), Как добавить напрямую свойства вершины в добавленную, потому что здесь есть дублирование.

PS: для получения дополнительной информации здесь приведен полный код http://pastebin.com/2iztGAa6


person KHALDOUN Mohsen    schedule 02.03.2015    source источник


Ответы (1)


Как вы заметили, вершины могут дублироваться, и это особенно верно, если вы «объединяете» несколько исходных графов в один граф.

Если вы не против переписать свойства вершины (и сохранить последнее назначенное значение на случай, если значения все время не идентичны), вы можете просто использовать карту свойств:

boost::property_map<Graph, boost::vertex_bundle_t>::type vpmap = boost::get(boost::vertex_bundle, testg);

//so:
vpmap[from] = gr[from];
vpmap[to]   = gr[to];

Опять же, есть и эквивалентный доступ:

testg[from] = gr[from];
testg[to]   = gr[to];

Вы даже можете адресовать отдельные элементы в комплекте:

boost::property_map<Graph, int VertexProperties::*>::type idmap    = boost::get(&VertexProperties::id, testg);
boost::property_map<Graph, int VertexProperties::*>::type labelmap = boost::get(&VertexProperties::label, testg);
idmap[from]    = gr[from].id;
labelmap[from] = gr[from].label;

Все примеры основаны на этой странице документации.

person sehe    schedule 02.03.2015
comment
это правильно ? vertex_t from = source(*ep, gr); vertex_t to = target(*ep, gr); boost::property_map<Graph, int VertexProperties::*>::type idmap = boost::get(&VertexProperties::id, testg); boost::property_map<Graph, int VertexProperties::*>::type labelmap = boost::get(&VertexProperties::label, testg); idmap[from] = gr[from].id; labelmap[from] = gr[from].label; boost::add_edge(from, to, EdgeProperties(idmap[from], labelmap[from]), testg); - person KHALDOUN Mohsen; 02.03.2015
comment
Почему вы продолжаете постить нечитаемую кашу в комментариях после того, как на вопрос уже был дан ответ? Я уверен, что вы можете проверить, правильно ли это. - person sehe; 02.03.2015