1

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

4

1 回答 1

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<>或类似的间接。

于 2016-07-11T23:30:31.097 回答