将数据从std::vector
设置为std::valarray
的最有效方法是什么?假设我们有std::valarray<double> my_valarray;
和std::vector<double> my_vector;
,我们希望将数据从my_vector
复制到my_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的移动语义是否适用于第一种情况,它只需要一次分配和一次传递来复制数据?
答案 0 :(得分:3)
是的,移动语义适用于第一种情况,因为std::valarray(my_vector.data(), my_vector.size())
是一个右值,并且为valarray
类(http://en.cppreference.com/w/cpp/numeric/valarray/operator%3D)定义了移动分配运算符。
答案 1 :(得分:1)
第一种选择更有效率。原因是std::valarray::resize
对所有数据进行零初始化。但我认为任何值得它的编译器都会优化冗余的零初始化。
您无法阻止从向量复制到valarray,无法将内存块的所有权从my_vector传输到my_valarray。