multi_array_view 没有深拷贝的赋值?

multi_array_view assignment without deep copy?

如何重新分配提升 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

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

  • 不可重新安置
  • 它在语义上是对象的别名 "bound to"

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

All of the non-const array types in this library provide assignment operatorsoperator=(). Each of the array types multi_array, multi_array_ref, subarray, and array_view can be assigned from any of the others, so long as their shapes match. The const variants, const_multi_array_ref, const_subarray, and const_array_view, can be the source of a copy to an array with matching shape. Assignment results in a deep (element by element) copy of the data contained within an array.

这里讨论的是分配给可变数组(视图)。

但是:

Effects. This constructs a shallow copy of x.

方法

也许您可以使用 const_multi_array_ref

否则,您可能应该查看 "break" 不可重置引用的绑定,其方式与我们对 C++ 引用的绑定方式完全相同:std::reference_wrapper<> 或类似的间接寻址。