添加一个外部属性以包含图中顶点的索引(boost)

adding an external property to include index for vertix in graph (boost)

本文关键字:顶点 索引 boost 包含图 属性 一个 外部 添加      更新时间:2023-10-16

我试图使用associative_property_map包括索引的顶点,但我得到以下错误与以下简单的代码,问题是什么?

#include <boost/graph/iteration_macros.hpp>
#include <boost/graph/adjacency_list.hpp>
using namespace std;
using namespace boost;
struct NodeData
{
    int label;
};
struct EdgeData
{
    int age;
};
typedef map<vecS, size_t> IndexMap;
IndexMap mapIndex;
associative_property_map<IndexMap> propmapIndex(mapIndex);
typedef adjacency_list<setS, setS, undirectedS, NodeData, EdgeData> Graph;
typedef Graph::vertex_descriptor NodeID;
typedef Graph::edge_descriptor EdgeID;
int main()
{
    Graph g;
    NodeID n0 = add_vertex(g); g[n0].label = -1;
    NodeID n1 = add_vertex(g); g[n1].label = -1;
    EdgeID edge; bool ok;
    tie(edge, ok) = boost::add_edge(n0, n1, g);
    if (ok) g[edge].age = 10;
    int i=0;
    BGL_FORALL_VERTICES(v, g, Graph)
    {
        put(propmapIndex, v, i++);
    }
    return 0;
}

错误:

c:program filescodeblocksmingwbin..libgccmingw324.4.1........includeboostproperty_mapproperty_map.hpp||In

function 'void boost::put(const boost::put_get_helper&, K, const V&)[with PropertyMap = boost::associative_property_map, std::allocator>

, Reference = unsigned int&, K = void*, V = int]':| C:UsersmemoDesktopDebugedboostGraphmain.cpp|39|instantiated from这里| c: 程序文件 codeblocks mingw bin . . lib gcc…… mingw32 4.4.1包括促进 property_map property_map.hpp | 361 |错误:在'(const boost::associative_property_map,)中'operator[]'不匹配,Std::allocator>>&)((const boost::associative_property_map,Std::allocator>>*)(&pa)) [k]"| c: 程序文件 codeblocks mingw bin . . lib gcc…… mingw32 4.4.1包括促进 property_map property_map.hpp | 498 |注意:候选者有:typenameUniquePairAssociativeContainer:: value_type:: second_type&boost:: associative_property_map::操作符[](const typenameUniquePairAssociativeContainer::key_type&) const [withuniquepairassociativcontainer = std::map, std::allocator>>]| ||===构建完成:1个错误,0个警告===|

谢谢

顶点描述符必须指定为IndexMap,所以它是map<NodeID, size_t>而不是map<vecS, size_t>:

<...>
typedef Graph::vertex_descriptor NodeID;
typedef map<NodeID, size_t> IndexMap;
IndexMap mapIndex;
associative_property_map<IndexMap> propmapIndex(mapIndex);
<...>
// indexing all vertices
int i=0;
BGL_FORALL_VERTICES(v, g, Graph)
{
   put(propmapIndex, v, i++);
}