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<>
或类似的间接寻址。
如何重新分配提升 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<>
或类似的间接寻址。