Boost Bundled Properties: нужно ли инициализировать все свойства для каждого ребра? - PullRequest
0 голосов
/ 16 мая 2018

Я создал график в Boost, и я использую связанные свойства. Мне не нужно каждое свойство для каждого ребра, но мне нужно их все для некоторых ребер. У меня вопрос: я не могу установить некоторые свойства, или все они должны быть установлены при создании края?

struct EdgeProperty 
{
    double weight;
    int index;
    int property_thats_only_used_sometimes;
    bool property_thats_only_used_sometimes2;
};
//would this be enough:
edge_descriptor edge = add_edge(u, v, graph).first;
graph[edge].weight = 5;
graph[edge].index = 1;

1 Ответ

0 голосов
/ 17 мая 2018

Есть два способа прочитать вопрос:

Мой вопрос таков: не могу ли я установить некоторые свойства

Не в том смысле, что они не могут отсутствовать.Тип пучка - это единица измерения.

все ли они должны быть установлены при создании ребра?

Ну нет.Это C ++.В вашем примере не «установка» их всех оставит их в их неопределенных значениях.Для не примитивного типа применяется инициализация по умолчанию (скажем, std::string всегда получит значение по умолчанию "").

Чтобы предотвратить неопределенные данные, вы можете просто обеспечить инициализацию, либо добавив конструктор по умолчанию:

struct EdgeProperty {
    double weight;
    int index;
    int property_thats_only_used_sometimes;
    bool property_thats_only_used_sometimes2;

    EdgeProperty() 
      : weight(1.0), index(-1),
        property_thats_only_used_sometimes(0),
        property_thats_only_used_sometimes2(false)
    { }
};

или эквивалентно с использованием NSMI:

struct EdgeProperty {
    double weight = 1.0;
    int index     = -1;
    int property_thats_only_used_sometimes   = 0; 
    bool property_thats_only_used_sometimes2 = false;
};

Расширенные идеи

Возможно, вы не знаете, но вы также можете передавать свойства непосредственно в add_edge.Если вы хотите, вы можете предоставить подходящий конструктор, который будет принимать только обычно задаваемые свойства:

struct EdgeProperty {
    double weight;
    int index;

    EdgeProperty(double w = 1.0, int i = -1) : weight(w), index(i)
    { }

    int property_thats_only_used_sometimes = 0;
    bool property_thats_only_used_sometimes2 = 0;
};

Теперь вы можете просто создать ребро:

auto edge = add_edge(u, v, EdgeProperty(5, 1), graph).first;

Live Demo

Live On Coliru

#include <boost/graph/adjacency_list.hpp>

struct EdgeProperty {
    double weight;
    int index;

    EdgeProperty(double w = 1.0, int i = -1) : weight(w), index(i)
    { }

    int property_thats_only_used_sometimes = 0;
    bool property_thats_only_used_sometimes2 = 0;
};

using Graph = boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, boost::no_property, EdgeProperty>;

int main() {
    Graph graph;
    auto u = add_vertex(graph);
    auto v = add_vertex(graph);

    //would this be enough:
    auto edge = add_edge(u, v, EdgeProperty(5, 1), graph).first;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...