4

我有一个已知数量的复杂远场电场值的二进制文件,这些值与频率有关。每个条目有两个浮点值(32 位),其中第一个浮点数是实部,第二个是虚数)。所以文件大小为 2*4*(频率数)。

  1. 来自 C++11 标准,std::vector并且std::complex需要(可能是一个词太强?)在内存中是连续的。这对于复数值的向量是否正确?

  2. 是否可以使用该函数将上述二进制文件中的这些复数值直接加载到预先分配的 STL ( std::vector<std::complex>)中的底层动态数组中std::ifstream read

我应该补充一点,这些文件可以在 GB 范围内。分配固定或动态数组float,读入,然后复制到std::vector.

4

1 回答 1

1

如果你想走这条路,你将需要以下构造:

  1. ifstream::read(&vec[0],nFreq * sizeof(complex<float>))

  2. std::complex在预分配的内存上放置新的构造

  3. vector<complex<float>> vec; vec.reserve(nFreq); // remember to catch exception if allocation fails due to huge files

为了进一步“证明”(无法访问标准)您的放置和文件内容的有效性,请引用 cppreference.com

For any complex number z, 
reinterpret_cast<T(&)[2]>(z)[0] is the real part of z and 
reinterpret_cast<T(&)[2]>(z)[1] is the imaginary part of z.

For any pointer to an element of an array of complex numbers p and
any valid array index i, 
reinterpret_cast<T*>(p)[2*i] is the real part of the complex number p[i], and
reinterpret_cast<T*>(p)[2*i + 1] is the imaginary part of the complex number p[i]

这些要求实质上将 std::complex 的三个特化中的每一个的实现限制为声明两个且仅两个非静态数据成员,类型为 value_type,具有相同的成员访问权限,分别保存实部和虚部。

于 2013-04-30T22:12:07.520 回答