На C++ Boost Graph Создание и свойство vertex_index.
Я повышающий нуб. Мне интересно, почему компиляция не удается в следующем коде. Я создаю набор вершин и пытаюсь назначить свои собственные индексы и имена вершин. (Я следую за этой страницей: http://fireflyblue.blogspot.com/2008/01/boost-graph-library.html.)
Я это понимаю vertS
списки вершин в Boost
не требует явного создания идентификатора вершины, и я также видел этот очень связанный вопрос в Stackru ( как обеспечить свойство vertex_index для моего графа), в котором обсуждается, как использовать associative_property_map
назначить индексы вершин. Однако следующее - получение карты vertex_index и назначение пар ключ-значение - кажется довольно простым делом, и я хотел бы понять, почему он не работает. Любая помощь очень ценится!
Ошибка компиляции, как показано ниже:
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;
}
1 ответ
Выражение vertIndx[v]
возвращает вершину по значению. Таким образом, вы получаете ошибку, потому что это не lvalue, когда вы пытаетесь присвоить ей.
Кроме того, это на самом деле возвращает v
, Вот код, которым управляет vertIndx[v]
:
inline value_type operator[](key_type v) const { return v; }
Вот версия, которая, надеюсь, ясно о том, как это работает:
#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;
}