добавление внешнего свойства для включения индекса для вертикса в график (повышение) - PullRequest
1 голос
/ 30 октября 2011

Я пытаюсь использовать 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 files\codeblocks\mingw\bin..\lib\gcc\mingw32\4.4.1........\include\boost\property_map\property_map.hpp||In

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

, ссылка = без знака int &, K = пустота *, V = int] ': | C: \ Users \ memo \ Desktop \ Debuged \ boostGraph \ main.cpp | 39 | создается из здесь | C: \ Program Файлы \ CodeBlocks \ MinGW \ Bin .. \ Lib \ НКУ \ mingw32 \ 4.4.1 ........ \ Include \ подталкивание \ property_map \ property_map.hpp | 361 | ошибка: нет совпадения для 'operator []' in '(const boost :: associative_property_map, std :: allocator>>> &) ((const boost :: associative_property_map, std :: allocator>>> *) (& pa)) [k] '| C: \ Program Файлы \ CodeBlocks \ MinGW \ Bin .. \ Lib \ НКУ \ mingw32 \ 4.4.1 ........ \ Include \ подталкивание \ property_map \ property_map.hpp | 498 | Примечание: кандидаты являются: typename UniquePairAssociativeContainer :: value_type :: second_type & boost :: associative_property_map :: operator [] (постоянное имя типа UniquePairAssociativeContainer :: key_type &) const [с UniquePairAssociativeContainer = std :: map, std :: allocator>>] | || === Сборка завершена: 1 ошибка, 0 предупреждений === |

Спасибо

1 Ответ

5 голосов
/ 19 декабря 2011

Дескриптор вершины должен быть указан в 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++);
}
...