На 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;
}
Другие вопросы по тегам