Использование карт свойств Boost с пакетными типами - PullRequest
0 голосов
/ 03 июля 2018

У меня проблемы с получением карты свойств для графика, который я делаю. Я использую связанные свойства. Я сократил это до примера ниже. Я получаю сообщение об ошибке при попытке получить тип для IndexMap. Ошибка как компилятора VC ++, так и gcc - что-то вроде error forming a reference to void or illegal use of type void. Ошибка в бусте adjacency_list.hpp, но она вызвана моим экземпляром boost::property_map. Я не смог понять, какой должен быть правильный тип. Я прочитал документацию по бусту связанных свойств , но нашел их немного бесполезными. Есть мысли?

Редактировать: я использую Boost 1.67.0.

Edit2: по-видимому, изменение на vecS вместо listS для представления вершины исправляет это. Тем не менее, я бы предпочел использовать listS, так как мне нужно изменить график, перебирая его.

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graph_traits.hpp>
#include <boost/graph/properties.hpp>
#include <string>
#include <memory>
#include <utility>
#include <vector>

struct MyVertex
{
    std::string m_name;
};

int main()
{
    using graph_t = boost::adjacency_list<boost::vecS, boost::listS, boost::undirectedS, MyVertex>;
    using Vertex = boost::graph_traits<graph_t>::vertex_descriptor;
    using IndexMap = boost::property_map<graph_t, boost::vertex_index_t>::type;
    std::unique_ptr<graph_t> graph;
    std::vector<std::pair<int, int>> edges{ {0,1}, {0,2}, {1,2}, {3,4}, {1,3}, {1,4}};
    graph = std::make_unique<graph_t>(edges.begin(), edges.end(), 5);
    IndexMap index = boost::get(boost::vertex_index, *graph);
    return 0;
}

1 Ответ

0 голосов
/ 03 июля 2018

Как я объяснил ранее сегодня у вашего графа нет индекса вершины. Если вы хотите, чтобы он был, вы должны добавить его самостоятельно.

Live On Coliru

#include <boost/graph/adjacency_list.hpp>

struct MyVertex {
    int id;
    std::string name;
};

using graph_t = boost::adjacency_list<boost::vecS, boost::listS, boost::undirectedS, MyVertex>;
using Vertex = graph_t::vertex_descriptor;

int main() {
    graph_t g;
    auto v0 = add_vertex(MyVertex{0, "zero"},  g);
    auto v1 = add_vertex(MyVertex{1, "one"},   g);
    auto v2 = add_vertex(MyVertex{2, "two"},   g);
    auto v3 = add_vertex(MyVertex{3, "three"}, g);
    auto v4 = add_vertex(MyVertex{4, "four"},  g);

    for (auto [from, to] : { std::pair { v0, v1 }, { v0, v2 }, { v1, v2 }, { v3, v4 }, { v1, v3 }, { v1, v4 } }) {
        add_edge(from, to, g);
    }
}

Теперь вы можете использовать идентификатор в качестве индекса вершины:

auto index = get(&MyVertex::id, g);

PS. В C ++ 11 пишите

for (auto p : std::vector<std::pair<Vertex, Vertex> > { { v0, v1 }, { v0, v2 }, { v1, v2 }, { v3, v4 }, { v1, v3 }, { v1, v4 } }) {
    add_edge(p.first, p.second, g);
}

В C ++ 03 напишите: Live On Coliru

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...