我有一个矢量说[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);
我收到错误。
答案 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 -->