2

std::vector将数据从 a 设置为 a的最有效方法是std::valarray什么?假设我们有std::valarray<double> my_valarray;并且std::vector<double> my_vector;我们想要将数据从 复制my_vectormy_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 的移动语义是否适用于第一种情况,使其只需要一次分配和一次传递来复制数据?

4

2 回答 2

3

Yes, move semantics applies in the first case, because std::valarray(my_vector.data(), my_vector.size()) is an rvalue and a move assigment operator is defined for the valarray class(http://en.cppreference.com/w/cpp/numeric/valarray/operator%3D).

于 2015-01-04T12:05:10.317 回答
1

第一种选择效率更高。原因是std::valarray::resize零初始化所有数据。但我会假设任何值得一提的编译器都会优化冗余的零初始化。

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

于 2015-01-04T15:36:53.283 回答