将数据从 std::vector 传递到 std::valarray 的最有效方法

Posted

技术标签:

【中文标题】将数据从 std::vector 传递到 std::valarray 的最有效方法【英文标题】:Most efficient way to pass data to a std::valarray from a std::vector 【发布时间】:2015-01-04 11:51:09 【问题描述】:

将数据从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 的移动语义是否适用于第一种情况,使其只需要一次分配和一次传递来复制数据?

【问题讨论】:

O(2n) = O(n)。 IE。它具有线性时间复杂度。 你为什么首先使用 valarray? @Columbo 因为我正在用 valarrays 做一些向量数学,这就是它们的优点。当您可以使用 valarray 内置运算符时,不喜欢实现 lambdas 【参考方案1】:

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

【讨论】:

我们知道。问题是 [my_vector.data(), my_vector.data() + my_vector.size()) 中的每个元素都被复制了。【参考方案2】:

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

你不能阻止从vector复制到valarray,没有办法将内存块的所有权从my_vector转移到my_valarray。

【讨论】:

以上是关于将数据从 std::vector 传递到 std::valarray 的最有效方法的主要内容,如果未能解决你的问题,请参考以下文章

将数据从结构二进制复制到 std::vector

将数据从 std::Vector 存储到 Eigen::Vector 时出错 [重复]

来自指针的 std::array 或 std::vector

如何在不循环的情况下将数组的内容复制到 C++ 中的 std::vector?

将元素从 std::vector 复制到 std::stack c++

使用 std::optional 通过引用将 std::vector<int> 传递给函数