【问题标题】:Initialise Boost.MultiArray when defined inside struct?在结构内定义时初始化 Boost.MultiArray?
【发布时间】:2013-11-18 12:45:57
【问题描述】:

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

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 时,我对其进行了概括并犯了一个错误。现已修复。

【问题讨论】:

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


    【解决方案1】:

    您可以使用聚合初始化:

    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;
    

    或者,为了让您的代码几乎按照编写的方式运行,您可以使用调整大小:

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

    【讨论】:

    • someDataType container = { boost::multi_array&lt;int,3&gt;(boost::extents[5][5][5]) }; 那实际上在做什么?为什么container.data=boost::multi_array&lt;int,3&gt;(boost::extents[5][5][5]); 不起作用?我无法弄清楚我的代码和你的代码之间的特殊区别是什么让你相信(或者你知道)会解决我的问题。
    • 谢谢,我试试调整大小的方法。这是你说的第一件事对我来说很有意义:)
    • @Clonkex 初始化 (someDataType container = ...) 调用构造函数,它创建多数组,赋值 (container.data=...) 调用复制赋值运算符,它试图替换已经存在的多数组的元素(大小0x0x0) 右边的数组元素(大小为 5x5x5)
    • 是的,迈克尔的回答为我解释了这一点。他们都是很好的答案,但不幸的是,迈克尔的答案更适用于我的知识水平:)
    【解决方案2】:

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

    您必须在处理 container.data 之前设置范围,以便 Boost 可以为其分配内存。最简单的方法是使用“resize”:

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

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

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

    至于程序崩溃,好像你贴错了,编译失败。如果省略第二个“数据”,sn-p 将编译但崩溃。原因是这样的分配不符合 Multi Array 文档中指定的“前提条件”:源的形状和目标的形状应该相同。但是,左侧的形状为 [0][0][0],而右侧的范围为 [5][5][5]

    【讨论】:

    • “你好像贴错了” 我确实做到了。我在 17 分钟前注意到并编辑了 ;)
    • 你做到了。我想我明白为什么它现在失败了。谢谢,我会试一试你的答案,如果它证明是正确的(我相信它会这样),我会将其标记为答案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多