[英]On C++ Boost Graph Creation and the vertex_index Property.
I am boost noob. 我是助推器。 I am wondering why compilation fails in the following code.
我想知道为什么编译在以下代码中失败。 I am creating a set of vertices, and trying to assign my own vertex indices and vertex names.
我正在创建一组顶点,并尝试分配自己的顶点索引和顶点名称。 (I am following this page: http://fireflyblue.blogspot.com/2008/01/boost-graph-library.html . )
(我正在关注此页面: http : //fireflyblue.blogspot.com/2008/01/boost-graph-library.html 。)
I understand that vertS
vertex lists in Boost
does not need explicit vertex id creations, and I have also seen this very related question in Stackoverflow ( how provide a vertex_index property for my graph ) which discusses how to use an associative_property_map
to assign vertex indices. 我知道
Boost
中的vertS
顶点列表不需要显式顶点id创建,我也在Stackoverflow中看到了这个非常相关的问题( 如何为我的图提供vertex_index属性 ),讨论了如何使用associative_property_map
来分配顶点索引。 The following though - getting the vertex_index map, and assigning the key value pairs - seems a fairly straightforward thing to do, and I would like to understand why it fails. 以下虽然 - 获取vertex_index映射,并分配键值对 - 似乎是一件相当简单的事情,我想了解它失败的原因。 Any help is greatly appreciated!
任何帮助是极大的赞赏!
The compile error is as below: 编译错误如下:
error: expression is not assignable vertIndx[v] = i;
//Define graph
typedef boost::property<boost::vertex_name_t, std::string> sv_namePty;
typedef boost::property<boost::vertex_index_t, int, sv_namePty > sv_indx_n_name_pty;
typedef boost::property<boost::edge_weight_t, int> se_weightPty;
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS,
sv_indx_n_name_pty, se_weightPty> ScafGraph;
//descriptors
typedef boost::graph_traits<ScafGraph>::vertex_descriptor SV;
typedef boost::graph_traits<ScafGraph>::edge_descriptor SE;
//Graph Object
ScafGraph SG;
//property accessors
boost::property_map<ScafGraph,
boost::vertex_name_t>::type vertName = boost::get(boost::vertex_name, SG);
boost::property_map<ScafGraph,
boost::vertex_index_t>::type vertIndx = boost::get(boost::vertex_index, SG);
boost::property_map<ScafGraph,
boost::edge_weight_t>::type edgeWeight = boost::get(boost::edge_weight, SG);
//Populate Graph
std::vector<SV> svlist;
for(int i=0; i<4; i++) {
SV v = boost::add_vertex(SG);
svlist.push_back(v);
vertName[v] = std::to_string(i);
vertIndx[v] = i;
}
The expression vertIndx[v]
returns a Vertex by value. 表达式
vertIndx[v]
返回Vertex by value。 Thus you get the error because it's not an lvalue when you try to assign to it. 因此,您会收到错误,因为当您尝试分配它时,它不是左值。
Furthermore, it actually returns v
. 此外,它实际上返回
v
。 Here's the code run by vertIndx[v]
: 这是由
vertIndx[v]
运行的代码:
inline value_type operator[](key_type v) const { return v; }
Here's a version that is hopefully clear about how it works: 这是一个有希望清楚它如何工作的版本:
#include <boost\graph\adjacency_list.hpp>
int main()
{
//Define graph
typedef boost::adjacency_list
<
boost::vecS //! edge list
, boost::vecS //! vertex list
, boost::undirectedS //! undirected graph
, boost::property<boost::vertex_name_t, std::string> //! vertex properties : name
, boost::property<boost::edge_weight_t, int> //! edge properties : weight
> ScafGraph;
//descriptors
typedef boost::graph_traits<ScafGraph>::vertex_descriptor SV;
typedef boost::graph_traits<ScafGraph>::edge_descriptor SE;
//Graph Object
ScafGraph SG;
//property accessors
boost::property_map<ScafGraph,
boost::vertex_name_t>::type vertName = boost::get(boost::vertex_name, SG);
boost::property_map<ScafGraph,
boost::vertex_index_t>::type vertIndx = boost::get(boost::vertex_index, SG);
boost::property_map<ScafGraph,
boost::edge_weight_t>::type edgeWeight = boost::get(boost::edge_weight, SG);
//Populate Graph
std::vector<SV> svlist;
for (int i = 0; i < 4; i++) {
SV v = boost::add_vertex(ScafGraph::vertex_property_type(std::to_string(i)), SG);
svlist.push_back(v);
assert(vertName[v] == std::to_string(i));
assert(vertIndx[v] == i);
}
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.