我有一个已知数量的复数远场电场值的二进制文件,它取决于频率。每个条目有两个浮点值(32位),第一个浮点数是实部,第二个是虚数。所以文件大小为2 * 4 *(频率数)。
从C ++ 11标准来看,std::vector
和std::complex
是必需的(可能过于强烈?)在内存中是连续的。这对于复杂值的向量是否正确?
是否可以使用std::vector<std::complex>
std::ifstream
将上述二进制文件中的这些复杂值直接加载到预先分配的STL(read
)中的基础动态数组中功能?
我应该补充一点,这些文件可以在GB范围内。分配float
的固定或动态数组,读入,然后复制到std::vector
中是不切实际的。
答案 0 :(得分:1)
如果你想走这条路,你需要以下结构:
ifstream::read(&vec[0],nFreq * sizeof(complex<float>))
placement new用于构建预分配内存的std::complex
vector<complex<float>> vec;
vec.reserve(nFreq); // remember to catch exception if allocation fails due to huge files
要进一步“证明”(无法访问标准)展示位置和文件内容的有效性,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的非静态数据成员,它们具有相同的成员访问权限,包含实部和虚部,分别