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

时间:2014-06-15 12:56:19

标签: c++ pointers vector g++

使用标准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];

2 个答案:

答案 0 :(得分:4)

根据C ++标准

If z is an lvalue expression of type cv std::complex<T> then:
— the expression reinterpret_cast<cv T(&)[2]>(z) shall be well-formed,
— reinterpret_cast<cv T(&)[2]>(z)[0] shall designate the real part of z, and
— reinterpret_cast<cv T(&)[2]>(z)[1] shall designate the imaginary part of z.
Moreover, if a is an expression of type cv std::complex<T>* and the expression a[i] is well-defined
for an integer expression i, then:
— reinterpret_cast<cv T*>(a)[2*i] shall designate the real part of a[i], and
— reinterpret_cast<cv T*>(a)[2*i + 1] shall designate the imaginary part of a[i].

所以你可以简单地写一下

using namespace std;
typedef complex<double> cmp;
.
.
int i,m=10;
vector<cmp> C(m);
//Do something to populate the vector C

double * r = &reinterpret_cast<double(&)[2]>( C[0] )[0];
double * i = &reinterpret_cast<double(&)[2]>( C[0] )[1];

这是一个例子

#include <iostream>
#include <complex>
#include <vector>

int main() 
{
    std::vector<std::complex<double>> v( 1, { 1.1, 2.2 } );

    double * r = &reinterpret_cast<double(&)[2]>( v[0] )[0];
    double * i = &reinterpret_cast<double(&)[2]>( v[0] )[1];

    std::cout << *r << '\t' << *i << std::endl;

    return 0;
}

输出

1.1 2.2

答案 1 :(得分:2)

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

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

如果需要考虑性能,则应该从头开始分割实部和虚部,而不首先构造std::complex<double>向量。