C++ 在结构内部定义时初始化Boost.MultiArray?

C++ 在结构内部定义时初始化Boost.MultiArray?,c++,boost,data-structures,multidimensional-array,C++,Boost,Data Structures,Multidimensional Array,假设我有这样一个结构: struct someDataType { boost::multi_array<int,3> data; }; struct someDataType { boost::多_数组数据; }; 然后如何初始化阵列?我已经试过了,但似乎不起作用: someDataType container; container.data=boost::multi_array<int,3>(boost::extents[5][5][5]); someD

假设我有这样一个结构:

struct someDataType
{
    boost::multi_array<int,3> data;
};
struct someDataType
{
boost::多_数组数据;
};
然后如何初始化阵列?我已经试过了,但似乎不起作用:

someDataType container;
container.data=boost::multi_array<int,3>(boost::extents[5][5][5]);
someDataType容器;
container.data=boost::multi_数组(boost::extensts[5][5]);
程序在运行时与该代码一起崩溃;当编译为debug时,它会从Boost代码中的某个地方抛出一个
断言失败

任何帮助都将不胜感激:)


编辑:我刚刚意识到我写的代码有点不正确。我的意思是,我在程序中是正确的,但是当我把它复制到计算机上时,我把它概括起来,犯了一个错误。现在已修复。

您可以使用聚合初始化:

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

someDataType容器={boost::multi_数组(boost::extensts[5][5][5]);
或者提供一个默认构造函数

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

someDataType container;
struct someDataType
{
boost::多_数组数据;
someDataType():数据(boost::extensts[5][5][5]){}
};
someDataType容器;
或者,要使代码几乎与编写的代码一样工作,可以使用resize:

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

someDataType container;
container.data.resize(boost::extents[5][5][5]);
struct someDataType
{
boost::多_数组数据;
};
someDataType容器;
resize(boost::extensts[5][5]);

您可以使用聚合初始化:

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

someDataType容器={boost::multi_数组(boost::extensts[5][5][5]);
或者提供一个默认构造函数

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

someDataType container;
struct someDataType
{
boost::多_数组数据;
someDataType():数据(boost::extensts[5][5][5]){}
};
someDataType容器;
或者,要使代码几乎与编写的代码一样工作,可以使用resize:

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

someDataType container;
container.data.resize(boost::extents[5][5][5]);
struct someDataType
{
boost::多_数组数据;
};
someDataType容器;
resize(boost::extensts[5][5]);

首先,someDataType的声明只指定多维数组的维数,而不是范围

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

您还可以向someDataType添加构造函数并在其中设置扩展数据块:

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

至于程序崩溃,似乎你粘贴了一些错误的东西,这将导致编译失败。若省略了第二个“数据”,代码段将被编译,但会崩溃。原因是这种分配不符合多数组文档中指定的“先决条件”:源的形状和目标的形状应该相同。但是,左手边有[0][0][0]形状,而右手边有[5][5][5]

首先,someDataType的声明只指定多维数组的维数,而不是范围

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

您还可以向someDataType添加构造函数并在其中设置扩展数据块:

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

至于程序崩溃,似乎你粘贴了一些错误的东西,这将导致编译失败。若省略了第二个“数据”,代码段将被编译,但会崩溃。原因是这种分配不符合多数组文档中指定的“先决条件”:源的形状和目标的形状应该相同。但是,左侧具有形状[0][0][0],而右侧具有区段[5][5][5]

someDataType container={boost::multi_array(boost::extensts[5][5])它实际上在做什么?为什么
container.data=boost::multi_数组(boost::extensts[5][5])不工作?我无法确定我的代码和你的代码之间有什么特别的区别,这让你相信(或者你知道)可以解决我的问题。谢谢,我将尝试调整大小的方法。这是你说的对我有意义的第一件事:)@Clonkex初始化(
someDataType container=…
)调用构造函数,它创建多数组,赋值(
container.data=…
)调用复制赋值操作符,它试图替换已经存在的多数组(大小为0x0)的元素右边的数组元素(大小为5x5x5)是的,Michael的回答向我解释了这一点。它们都是很好的答案,但不幸的是,迈克尔的答案更适合我的知识水平:)
somedatatypecontainer={boost::multi_array(boost::extensts[5][5])它实际上在做什么?为什么
container.data=boost::multi_数组(boost::extensts[5][5])不工作?我无法确定我的代码和你的代码之间有什么特别的区别,这让你相信(或者你知道)可以解决我的问题。谢谢,我将尝试调整大小的方法。这是你说的对我有意义的第一件事:)@Clonkex初始化(
someDataType container=…
)调用构造函数,它创建多数组,赋值(
container.data=…
)调用复制赋值操作符,它试图替换已经存在的多数组(大小为0x0)的元素右边的数组元素(大小为5x5x5)是的,Michael的回答向我解释了这一点。这两个答案都很好,但不幸的是,对你来说,迈克尔的答案更适合我的知识水平:)“看来你贴错了什么东西”,我确实这么做了。我在17分钟前注意到了这一点,并进行了编辑;)是的。我想我明白为什么它现在失败了。谢谢,我会尝试一下你的答案,如果它被证明是正确的(我相信它是正确的):“好像你贴错了什么东西。”我确实这么做了。我在17分钟前注意到了这一点,并进行了编辑;)是的。我想我明白为什么它现在失败了。谢谢,我会尝试一下你的答案,如果它被证明是正确的(我相信它会),我会把它标记为答案:)