使用boost作为向量元素

时间:2018-01-14 09:37:13

标签: boost

我有一个矢量说[3,2,1,8,7]。图的顶点应为3,2,1,8,7。我怎样才能在循环中创建它。我可以在循环中使用boost的add_vertex函数来迭代这个向量吗?或者哪些是将这些矢量元素添加为图形顶点的最佳方法?

这是我尝试过的。 Group4是[3,2,1,8,7]的载体。

    struct Vertex{ float foo;};
    typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, Vertex > Graph;
    typedef boost::graph_traits < Graph >::vertex_descriptor vertex_t;
    Graph g(Group4.size());
    vertex_t Vertices[Group4.size()];
        for(T_INDEX i=0;i<Group4.size();i++){
            Vertices[i] = boost::add_vertex(Group4[i], g);
        }

        g[Group4[0]].foo = 3.4;

        boost::add_edge(Group4[0],Group4[2],g);
        boost::add_edge(Group4[1],Group4[2],g);

我收到错误。

1 个答案:

答案 0 :(得分:1)

   Vertices[i] = boost::add_vertex(Group4[i], g);

这会添加一个带有“Group4 [i]”的顶点作为bundle属性。这不起作用,因为它不是Vertex对象。相反,尝试

   Vertices[i] = add_vertex(Vertex{3.4}, g);

或者甚至

   Vertices[i] = add_vertex({3.4}, g);

有效:

<强> Live On Coliru

#include <boost/graph/adjacency_list.hpp>

struct Vertex {
    float foo;
};

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, Vertex> Graph;
typedef boost::graph_traits<Graph>::vertex_descriptor vertex_t;
using T_INDEX = Graph::vertices_size_type;

int main() {
    std::vector<int> Group4{ 3, 2, 1, 8, 7 };

    Graph g(Group4.size());
    std::vector<vertex_t> vertices(Group4.size());

    for (T_INDEX i = 0; i < Group4.size(); i++) {
        vertices[i] = add_vertex(Vertex{ 3.4 }, g);
    }

    boost::add_edge(Group4[0], Group4[2], g);
    boost::add_edge(Group4[1], Group4[2], g);
}
  

注意我用std::vector替换了你的VLA,因为可变长度数组是非标准的

真实问题

看看剩下的代码,在我看来,你真的在​​努力应对从顶点“ids”(3,2,1,8,7)到顶点描述符的映射。

你有什么作品,但从它的外观来看,你可以直接使用索引作为顶点描述符。

  

注意仅当您的顶点容器支持整数描述符并且您没有非常稀疏的id空间时(例如,如果您有ID 1,2,3和88837674,您将为其分配内存) 88837675个顶点,效率不高。

代码可能变成:

<强> Live On Coliru

#include <boost/graph/adjacency_list.hpp>

struct Vertex { float foo; };
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, Vertex> Graph;

#include <boost/graph/graph_utility.hpp> // print_graph

int main() {
    std::vector<int> Group4 { 3, 2, 1, 8, 7 };
    Graph g(1 + *std::max_element(Group4.begin(), Group4.end()));

    for (int v : Group4)
        g[v].foo = 3.4;

    boost::add_edge(0, 2, g);
    boost::add_edge(1, 2, g);

    print_graph(g);
}

这将打印图形,如下:

0 --> 2 
1 --> 2 
2 --> 
3 --> 
4 --> 
5 --> 
6 --> 
7 --> 
8 -->