提升捆绑属性:我是否需要初始化每个边缘的所有属性?

时间:2018-05-16 08:40:56

标签: c++ boost graph properties

我在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 :(得分:0)

有两种方法可以阅读这个问题:

  

我的问题是:我不能设置一些属性

不是因为他们不能缺席。 bundle类型是实例化的单位。

  

创建边缘时是否必须设置它们?

没有。这是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 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;
}