将二进制文件中的复数值读入STL向量

时间:2013-04-30 21:54:42

标签: c++

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

  1. 从C ++ 11标准来看,std::vectorstd::complex是必需的(可能过于强烈?)在内存中是连续的。这对于复杂值的向量是否正确?

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

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

1 个答案:

答案 0 :(得分:1)

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

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

  2. placement new用于构建预分配内存的std::complex

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

  4. 要进一步“证明”(无法访问标准)展示位置和文件内容的有效性,quote from 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的非静态数据成员,它们具有相同的成员访问权限,包含实部和虚部,分别