【问题标题】:How to find if a vertex exists in a boost graph?如何查找提升图中是否存在顶点?
【发布时间】:2018-01-03 14:16:09
【问题描述】:

我有一个提升图(带有捆绑属性)。我想查找图中是否已经存在具有特定值的顶点。有人可以帮我弄这个吗?在这里,我展示了我现有代码的 MWE:

Live on Coliru

#include <iostream>
#include <string>
#include <vector>
#include <boost/graph/adjacency_list.hpp>

struct mytuple
{
    int e1;
    int e2;
    int s;

    bool operator==(const mytuple& a) const
    {
        return ((e1 == a.e1) && (e2 == a.e2) && (s == a.s));
    }
};

struct MyVertex {
    std::string comments;
    int field1;
    mytuple value;
    MyVertex(std::string comments = std::string()) : comments(comments) {}
};

struct MyEdge {
    std::string label;
    MyEdge(std::string label = std::string()) : label(label) {}
};

// Define the graph with the vertex as a mytuple and the vertices container as a vector
using MyTree = boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, MyVertex, MyEdge>;
using Vertex = boost::graph_traits<MyTree>::vertex_descriptor; // Define Vertex
using VertexItr = boost::graph_traits<MyTree>::vertex_iterator; // Define Vertex iterator
using Edge = std::pair<boost::graph_traits<MyTree>::edge_descriptor, bool>; // Define Edge
using EdgeItr = boost::graph_traits<MyTree>::edge_iterator; // Define Edge Iterator

int main()
{
    MyTree mytree;

    Vertex v1 = boost::add_vertex(mytree);
    mytree[v1].value = {1, 1, 1};

    Vertex v2 = boost::add_vertex(mytree);
    mytree[v2].value = {2, 2, 2};

    Vertex v3 = boost::add_vertex(mytree);
    mytree[v3].value = {3, 3, 3};

    // Perhaps add some edges

    std::cout << "I want to find if my graph has a vertex containing the value {1, 1, 1}";
    // mytree.findvertex(with value {1, 1, 1})
}

【问题讨论】:

    标签: c++ search boost graph


    【解决方案1】:
    #include <iostream>
    #include <string>
    #include <vector>
    #include <boost/graph/adjacency_list.hpp>
    
    
    struct mytuple
    {
        int e1;
        int e2;
        int s;
    
        bool operator==(const mytuple& a) const
        {
            return ((e1 == a.e1) && (e2 == a.e2) && (s == a.s));
        }
    };
    
    struct MyVertex {
        std::string comments;
        int field1;
        mytuple value;
        MyVertex(std::string comments = std::string()) : comments(comments) {}
    };
    
    struct MyEdge {
        std::string label;
        MyEdge(std::string label = std::string()) : label(label) {}
    };
    
    // Define the graph with the vertex as a mytuple and the vertices container as a vector
    using MyTree = boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, MyVertex, MyEdge>;
    using Vertex = boost::graph_traits<MyTree>::vertex_descriptor; // Define Vertex
    using VertexItr = boost::graph_traits<MyTree>::vertex_iterator; // Define Vertex iterator
    using Edge = std::pair<boost::graph_traits<MyTree>::edge_descriptor, bool>; // Define Edge
    using EdgeItr = boost::graph_traits<MyTree>::edge_iterator; // Define Edge Iterator
    
    VertexItr findvertex(const MyTree& g, const mytuple& value){
        VertexItr vi, vi_end;
        for (boost::tie(vi, vi_end) = vertices(g); vi != vi_end; ++vi) {
            if(g[*vi].value == value) return vi;
        }
        return vi_end;
    }
    
    int main()
    {
        MyTree mytree;
    
        Vertex v1 = boost::add_vertex(mytree);
        mytree[v1].value = {1, 1, 1};
        mytree[v1].comments = "I am the one you seek";
    
        Vertex v2 = boost::add_vertex(mytree);
        mytree[v2].value = {2, 2, 2};
    
        Vertex v3 = boost::add_vertex(mytree);
        mytree[v3].value = {3, 3, 3};
    
        // Perhaps add some edges
    
        std::cout << "I want to find if my graph has a vertex containing the value {1, 1, 1}\n";
        mytuple tuple = { 1,1,1};
        const auto iter = findvertex(mytree, tuple);
        const auto theEnd = boost::vertices(mytree).second;
        if(iter != theEnd){
        std::cout << "'ere I be: " << mytree[*iter].comments << '\n';
        }
        else{
            std::cout << "failed to find tuple\n";
        }
    }
    

    g++ graph.cpp -std=c++11 -o graph.o -l boost_graph编译 产生输出

    I want to find if my graph has a vertex containing the value {1, 1, 1}
    'ere I be: I am the one you seek
    

    【讨论】:

    • 非常有帮助!非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2021-05-18
    • 2018-11-23
    • 2021-03-04
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多