使用浅层数组适配器的通常建议对我来说有点讽刺 - 为了能够简单地通过指针访问数组,您应该将其放入带有所有引用计数的共享数组中(这些计数归零,因为您不拥有该数组),还有一个数据别名的噩梦。
实际上,uBLAS具有存储的完整实现(
array_adaptor
),可以使用外部c数组与向量一起使用。唯一的问题是向量构造函数会创建副本。为什么库中没有使用这个好功能,这真的超出了我的理解范围,但无论如何,我们可以使用一个小扩展(实际上只是2行代码,被通常的c++臃肿所包围)。
template<class T>
class extarray_vector :
public vector<T, array_adaptor<T> >
template <size_type N>
BOOST_UBLAS_INLINE
extarray_vector(T (&a)[N])
template<class V>
BOOST_UBLAS_INLINE
extarray_vector& operator = (const vector<T, V>& v)
template<class VC>
BOOST_UBLAS_INLINE
extarray_vector& operator = (const vector_container<VC>& v)
template<class VE>
BOOST_UBLAS_INLINE
extarray_vector& operator = (const vector_expression<VE>& ae)
};
您可以像这样使用它:
int i[] = {1, 4, 9, 16, 25, 36, 49};
extarray_vector<int> iv(i);
BOOST_ASSERT_MSG(i == &iv[0], "Vector should attach to external array\n");
iv[3] = 100;
BOOST_ASSERT(i[3] == 100);
iv.resize(iv.size() + 1, true);
BOOST_ASSERT_MSG(i != &iv[0], "And detach from the array on resize\n");
iv[3] = 200;
BOOST_ASSERT(i[3] == 100);
iv.data().resize(7, i, 0);
BOOST_ASSERT_MSG(i == &iv[0], "And attach back to the array\n");
BOOST_ASSERT(i[3] == 200);
你可以通过array_adaptor的resize方法动态地将向量附加和分离到外部存储器(保留或舍弃数据)。在重新调整大小时,它会自动从存储中分离出来并成为常规向量。从容器中赋值直接进入存储器中,但是从表达式中赋值则通过一个临时变量进行,并且向量从存储器中分离出来,请使用
noalias()
来防止这种情况发生。构造函数中存在少量开销,因为data_是私有成员,我们必须使用new T[0]进行默认初始化,然后重新分配给外部数组。你可以将其更改为protected,并直接在构造函数中分配给存储器。
a
*被重新分配为指向它,然后新数据被改变。 - Chris TaylormxGetData
等)时,MATLAB不会创建副本。当然,这并不能阻止您通过将原始指针包装在std::vector
中来制作副本。 - Amro