初始化 Boost.MultiArray 在结构中定义时

Initialise Boost.MultiArray when defined inside struct?

本文关键字:定义 结构 Boost MultiArray 初始化      更新时间:2023-10-16

假设我有一个这样的结构:

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

然后如何初始化数组?我已经尝试过了,但它似乎不起作用:

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

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

任何帮助将不胜感激:)

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

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

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

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

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

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

至于程序崩溃,似乎你粘贴了错误的东西,它会失败编译。如果省略第二个"数据",代码段将编译但崩溃。原因是此类分配不符合多数组文档中指定的"前提条件":源的形状和目标的形状应该相同。但是,左侧具有形状[0][0][0],而右侧具有范围[5][5][5]

您可以使用聚合初始化:

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]);