【问题标题】:multi_array_view assignment without deep copy?没有深拷贝的 multi_array_view 分配?
【发布时间】:2016-07-11 21:23:12
【问题描述】:

如何重新分配 boost multi_array_view 以指向 multi_array 的不同部分?我不想要深拷贝。

boost::multi_array<int, 2> a(...);
array_view b = a[indices[index_range(0, 5)][index_range()]];
array_view c = a[indices[index_range(0, 10)][index_range()]];
b = c; // don't work

提升来源:

template <typename ConstMultiArray>
multi_array_ref& operator=(const ConstMultiArray& other) {
    function_requires< 
      multi_array_concepts::
      ConstMultiArrayConcept<ConstMultiArray,NumDims> >();

    // make sure the dimensions agree
    BOOST_ASSERT(other.num_dimensions() == this->num_dimensions());
    BOOST_ASSERT(std::equal(other.shape(),other.shape()+this->num_dimensions(),
                            this->shape()));
    // iterator-based copy
    std::copy(other.begin(),other.end(),this->begin());
    return *this;
}

更新:我最终更改了程序中的方法,以保留对 boost::indices[...] 创建的索引对象的引用。然后我可以随时使用该对象创建一个新的array_view

【问题讨论】:

    标签: c++ boost boost-multi-array


    【解决方案1】:

    看起来multi_array_ref 模拟了一个 C++ 参考:

    • 不可重新安装
    • 它在语义上是它“绑定到”的对象的别名

    有点令人惊讶的是,const_multi_array_ref 的情况似乎并非如此。请注意这些文档引用:

    此库中的所有非常量数组类型都提供赋值运算符operator=()。每个数组类型 multi_array、multi_array_ref、subarray 和 array_view 都可以从其他数组类型中分配,只要它们的形状匹配。 const 变体 const_multi_array_ref、const_subarray 和 const_array_view 可以是具有匹配形状的数组的副本的来源。 赋值导致数组中包含的数据的深度(逐个元素)副本

    这谈论分配给可变数组(视图)。

    但是:

    效果。这构造了 x 的浅拷贝

    方法

    也许您可以改用const_multi_array_ref

    否则,您可能应该以与我们对 C++ 引用完全相同的方式“破坏”不可重置引用的绑定:std::reference_wrapper&lt;&gt; 或类似的间接引用。

    【讨论】:

    • 谢谢,这很有帮助。 multi_array_ref 仅适用于引用整个 multi_array,而不是 multi_array 的一部分的视图,对吗?
    • 另外,如果我有一个返回array_view 的函数,我是否需要将它包装在reference_wrapper 中以避免深拷贝?
    • 我刚刚意识到返回reference_wrapper 没有多大意义。我想我必须把它放在堆上。
    • 是的。对于m-a-r来说,这些都不是特别的。与 c++ 引用完全相同。您可以很好地返回reference_wrapper。只是不要使用它来返回对本地的引用。 m-a-r 也可以用来指代任何连续的数组,而不仅仅是一个完整的 boost::multi_array
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 2014-10-10
    • 2012-04-12
    • 2014-12-21
    • 2015-01-13
    • 2011-09-05
    • 1970-01-01
    相关资源
    最近更新 更多