2015-01-04 107 views
2

将数据从std::vector设置为std::valarray的最有效方法是什么?假设我们有std::valarray<double> my_valarray;std::vector<double> my_vector;,我们要复制的数据对面my_vectormy_valarray将数据从std :: vector传递到std :: valarray的最有效方法

选项1(使用valarray构造函数和拷贝赋值):

my_valarray = std::valarray(my_vector.data(), my_vector.size()); 

选项2(调整大小和复制):

my_valarray.resize(my_vector.size()); 
std::copy(my_vector.begin(), my_vector.end(), std::begin(my_valarray));  

问题的产生是因为在这两种情况下,它看起来像复杂O(2N)。在第一种情况下,在施工期间(一次分配+一次复制数据),然后分配给最终对象(一次分配+一次复制数据),将数据复制到临时valarray。在第二种情况下,有一个分配+一个通道用于将所有元素初始化为零,另一个通过复制数据。在第一种情况下,C++ 11的移动语义是否适用,只需要一次分配和一次复制就可以复制数据?

+2

* O(2n)= O(n)*。即它具有线性时间复杂度。 – Columbo 2015-01-04 11:57:37

+0

为什么你首先使用valarray? – Columbo 2015-01-04 11:59:09

+2

@Columbo因为我正在用valarrays做一些矢量数学,这就是他们的优点。当您可以使用valarray内置运算符时,不喜欢实现lambda表达式 – 2015-01-04 12:11:08

回答

3

是的,移动语义适用于第一种情况,因为std::valarray(my_vector.data(), my_vector.size())是一个右值,移动分配运算符是为valarray类(http://en.cppreference.com/w/cpp/numeric/valarray/operator%3D)定义的。

+2

我们知道。问题是['my_vector.data()','my_vector.data()+ my_vector.size()')中的每个元素都被复制。 – Columbo 2015-01-04 12:14:04

1

第一个选项更高效。原因是std::valarray::resize对所有数据进行了零初始化。但是我认为任何值得使用盐的编译器都会优化冗余零初始化。

您无法阻止将矢量复制到valarray,也无法将内存块的所有权从my_vector转移到my_valarray。

相关问题