在struct中定义时初始化Boost.MultiArray?

时间:2013-11-07 01:31:29

标签: c++ boost data-structures multidimensional-array

说我有这样的结构:

struct someDataType
{
    boost::multi_array<int,3> data;
};

如何初始化阵列?我已经尝试过了,但它似乎不起作用:

someDataType container;
container.data=boost::multi_array<int,3>(boost::extents[5][5][5]);

程序在运行时使用该代码崩溃;当编译为debug时,它会从Boost代码中的某个位置抛出assertion failed

任何帮助将不胜感激:)

编辑:我刚才意识到我错误地写了一些代码。我的意思是,我在程序中使用它是正确的,但是当我将它复制到SO时,我将其概括为一并犯了一个错误。现在修好了。

2 个答案:

答案 0 :(得分:4)

首先,someDataType的声明仅指定multi_array有多少维度,而不是范围。

你必须在处理container.data之前设置范围,以便Boost可以为它分配内存。简单的方法是使用“调整大小”:

  container.data.resize(boost::extents[5][5][5]);

您还可以向someDataType添加构造函数并在那里设置范围:

someDataType::someDataType(): data(boost::extents[5][5][5]){}

至于程序崩溃,似乎你粘贴了一些错误,它将无法编译。如果省略第二个“数据”,则代码段将编译但崩溃。原因是这样的赋值失败了Multi Array文档中指定的“前提条件”:源的形状和目标的形状应该相同。但是,左手边有形状[0] [0] [0]而右手边有范围[5] [5] [5]

答案 1 :(得分:2)

您可以使用聚合初始化:

someDataType container = { boost::multi_array<int,3>(boost::extents[5][5][5]) };

或提供默认构造函数

struct someDataType
{
    boost::multi_array<int,3> data;
    someDataType() : data(boost::extents[5][5][5]) {}
};

someDataType container;

或者,为了使您的代码几乎按照书面形式工作,您可以使用resize:

struct someDataType
{
    boost::multi_array<int,3> data;
};

someDataType container;
container.data.resize(boost::extents[5][5][5]);