在 C++ 中获取指向复数向量的实部和虚部的指针

xad*_*adu 6 c++ pointers g++ vector

使用标准的 C++ 复数和向量库,我定义了一个复数向量。现在,我想获得指向double *包含这个复数向量实部和虚部的向量的指针(类型为)。以下解决方案有效,但由于内存使用量增加了一倍,因此既不优雅又浪费;

using namespace std;
typedef complex<double> cmp;
.
.
int i,m=10;
vector<cmp> C(m);
//Do something to populate the vector C
vector<double> R(m), I(m);
for(i=0; i<m; i++){
 R[i] = C[i].real();
 I[i] = C[i].imag();
}
double * r = &R[0];
double * i = &I[0];
Run Code Online (Sandbox Code Playgroud)

Gug*_*ugi 3

(C++03) 标准没有定义一个std::complex<double>外观的内部结构,但通常它由 2 个双精度数组成,实部位于虚部之前。因此,给定一个数组(或std::vectorstd::complex<double>,您无法获得一个指向所有实部数组的指针,以及另一个指向所有虚部数组的指针:实部和虚部是交错的。如果您确实需要将它们分开,则在不复制所有元素的情况下就无法做到这一点(就像您已经做的那样)。

但你为什么要首先将它们分开呢?将它们传递给某个图书馆的某些例程?也许该库也支持交错格式?在这种情况下,你可以做一个reinterpret_cast<double*>(&C[0]). 请注意,这是非标准的,但它似乎在大多数情况下都有效。有关更多信息,请参阅广泛使用的 fftw-library 的文档,其中推荐使用此方法。

如果性能是一个问题,您应该从一开始就将实部和虚部分开,而不是std::complex<double>先构建向量。