文件I / O为数组向量

时间:2017-08-25 17:14:55

标签: c++ arrays vector

对于如何将std::vector写入文件,此问题有很好的答案:Reading and writing a std::vector into a file correctly

就我而言,我有一个数组向量:

vector<array<double, 3> > vec;

我想写入一个文件,以获得具有以下格式的文件,其中值为双精度,第一个数字是向量中的位置,第二个是数组中的位置:

vec0_0 vec0_1 vec0_2 vec1_0 vec1_1 vec1_2 vec2_0 ...

我可以使用......

std::copy(vec.begin(), vec.end(), std::ostreambuf_iterator<char>(FILE));

...或...

size_t sz = vec.size();
FILE.write(reinterpret_cast<const char*>(&vec[0]), sz * sizeof(vec[0]));

...正如上面提到的标量类型问题所提出的那样,或者我需要采用不同的方式,因为vector中的类型是array

1 个答案:

答案 0 :(得分:1)

据我所知,std :: array具有连续的存储空间。但是,我不认为保证没有填充。如果它只是一个双[3],它可以开箱即用,但我认为你必须非常仔细地测试并担心容器内的std :: array的可移植性。

事实上,环顾四周有一个系统可以填充的例子。

std::array alignment

sizeof(int) = 4;  
sizeof( std::tr1::array< int,3 > ) = 16;  
sizeof( std::tr1::array< int,4 > ) = 16;    
sizeof( std::tr1::array< int,5 > ) = 32;

大概这个填充是实现定义的,或者你可以在标准的某个地方找到它。在任何情况下,我只是迭代事物或使用非stl数组。

我猜这个概念类似于struct,其中经常引入填充以优化内存访问,但编译器正在优化该填充,并且可以在大多数编译器上关闭{{1语句。据我所知,不是stl容器。