使用Boost Graph [BGL]检查add_edge之前是否已存在顶点

时间:2017-03-30 10:00:38

标签: c++ boost-graph

有没有办法检查使用Boost创建的图形中的顶点是否已经存在而不是循环顶点?

如果它已经存在,如何使用其顶点描述符添加新边?

示例:

Graph g;
vertex v;

v = add_vertex(1, g);
vertex_name[v] = "root";

v = add_vertex(2, g);
vertex_name[v] = "vert_2";

v = add_vertex(3, g);
vertex_name[v] = "vert_3";

// This is not possible
edge e1;
if (vertex.find("root") == vertex.end()) {
   (boost::add_edge("root", "vert_2", g)).first
}

1 个答案:

答案 0 :(得分:5)

我想你可能喜欢labeled_graph适配器:

<强> Live On Coliru

#include <iostream>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/labeled_graph.hpp>

using namespace boost;

int main()
{
    using AdjList = adjacency_list<setS, vecS, directedS>;
    using Graph = labeled_graph<AdjList, std::string, hash_mapS>;

    Graph g;

    for (std::string name : { "root", "vert_2", "vert_3" }) {
        add_vertex(name, g);
    }

    struct { std::string from, to; } edges [] = {
        {"root", "vert_2"},
        {"vert_2", "vert_3"},
        {"vert_2", "vert_3"},
        {"vert_2", "new_1"},
        {"new_1", "new_2"},
    };

    for (auto const& addition : edges) {
        if (g.vertex(addition.from) == g.null_vertex())
            std::cout << "source vertex (" << addition.from << ") not present\n";
        else if (g.vertex(addition.to) == g.null_vertex())
            std::cout << "target vertex (" << addition.to << ") not present\n";
        else {
            auto insertion = add_edge_by_label(addition.from, addition.to, g);
            std::cout << "Edge: (" << addition.from << " -> " << addition.to << ") "
                << (insertion.second? "inserted":"already exists")
                << "\n";
        }
    }
}

打印:

Edge: (root -> vert_2) inserted
Edge: (vert_2 -> vert_3) inserted
Edge: (vert_2 -> vert_3) already exists
target vertex (new_1) not present
source vertex (new_1) not present