将数据从 std::vector 传递到 std::valarray 的最有效方法
Most efficient way to pass data to a std::valarray from a std::vector
将数据从 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 的移动语义是否适用于第一种情况,使其只需要一次分配和一次传递来复制数据?
是的,移动语义适用于第一种情况,因为 std::valarray(my_vector.data(), my_vector.size())
是右值并且为 valarray
class(http://en.cppreference.com/w/cpp/numeric/valarray/operator%3D) 定义了移动赋值运算符.
第一个选项效率更高。原因是 std::valarray::resize
零初始化所有数据。但我认为任何值得它的盐的编译器都会优化冗余的零初始化。
您无法阻止从 vector 复制到 valarray,无法将内存块的所有权从 my_vector 转移到 my_valarray。
将数据从 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 的移动语义是否适用于第一种情况,使其只需要一次分配和一次传递来复制数据?
是的,移动语义适用于第一种情况,因为 std::valarray(my_vector.data(), my_vector.size())
是右值并且为 valarray
class(http://en.cppreference.com/w/cpp/numeric/valarray/operator%3D) 定义了移动赋值运算符.
第一个选项效率更高。原因是 std::valarray::resize
零初始化所有数据。但我认为任何值得它的盐的编译器都会优化冗余的零初始化。
您无法阻止从 vector 复制到 valarray,无法将内存块的所有权从 my_vector 转移到 my_valarray。