在不复制的情况下将 valarray 转换为向量
Converting a valarray to a vector without copying
我有一个非常大的 valarray,我需要将其转换为矢量,因为我使用的库只将矢量作为输入。我想知道是否可以在不复制的情况下从 valarray 转换为 vector。这是我拥有的:
#include <vector>
#include <valarray>
int main() {
std::valarray<double> va{ {1, 2, 3, 4, 5} };
//Error: cannot convert from 'initializer list' to 'std::vector<eT,std::allocator<_Ty>>'
//std::vector<double> v1{ std::begin(va), va.size() };
//Error: cannot convert from 'std::valarray<double>' to 'std::vector<eT,std::allocator<_Ty>>'
//std::vector<double> v2{ std::move(va) };
// Works but I'm not sure if it's copying
std::vector<double> v3;
v3.assign(std::begin(va), std::end(va));
}
assign 上的文档说函数 "assigns new contents to the vector, replacing its current contents, and modifying its size accordingly."。这听起来像是复制品。有没有不用复制的方法?
不,恐怕不复制就无法将 valarray
转换为 vector
。
您的选择是:
- 将您现有的代码库转换为使用
vector
,并使用 expression templates 以保留 valarray
的大部分优点。
- 转换库以使用
valarray
。
- 复制。
我将从选项 3 开始,然后直接复制。
我有一个非常大的 valarray,我需要将其转换为矢量,因为我使用的库只将矢量作为输入。我想知道是否可以在不复制的情况下从 valarray 转换为 vector。这是我拥有的:
#include <vector>
#include <valarray>
int main() {
std::valarray<double> va{ {1, 2, 3, 4, 5} };
//Error: cannot convert from 'initializer list' to 'std::vector<eT,std::allocator<_Ty>>'
//std::vector<double> v1{ std::begin(va), va.size() };
//Error: cannot convert from 'std::valarray<double>' to 'std::vector<eT,std::allocator<_Ty>>'
//std::vector<double> v2{ std::move(va) };
// Works but I'm not sure if it's copying
std::vector<double> v3;
v3.assign(std::begin(va), std::end(va));
}
assign 上的文档说函数 "assigns new contents to the vector, replacing its current contents, and modifying its size accordingly."。这听起来像是复制品。有没有不用复制的方法?
不,恐怕不复制就无法将 valarray
转换为 vector
。
您的选择是:
- 将您现有的代码库转换为使用
vector
,并使用 expression templates 以保留valarray
的大部分优点。 - 转换库以使用
valarray
。 - 复制。
我将从选项 3 开始,然后直接复制。