如何直接将大量内存读入std :: vector?

时间:2013-01-17 13:37:00

标签: c++ c++11 placement-new

我有一个巨大的连续数组x,我fread来自一个文件。

如何将此块放入std::vector<>?换句话说,我更喜欢将结果放在std::vector<>而不是数组中,但我希望得到的C ++代码与这个将Cunk版本直接放入数组的普通C版本一样高效。 / p>

从搜索周围,我想我可能不得不以某种形式使用placement-new,但我不确定呼叫顺序和所有权问题。另外,我是否需要担心对齐问题?

我正在使用T = unsigned进行测试,但我希望有一个合理的解决方案适用于任何POD结构。

using T = unsigned;
FILE* fp = fopen( outfile.c_str(), "r" );
T* x = new T[big_n];
fread( x, sizeof(T), big_n, fp );

// how do I get x into std::vector<T> v
// without calling a gazillion push_backs() or copies ?!?

delete[] x;
fclose( fp );

2 个答案:

答案 0 :(得分:10)

使用设置向量大小的std::vector constructor,并使用std::vector::data获取指向已分配内存的指针。

保持使用fread

std::vector<T> x(big_n);
fread(x.data(), sizeof(T), big_n, fp);

如其他人所述,如果fread类型不是POD type,则使用T很可能无效。然后,您可以使用C ++流和std::istreambuf_iterator将文件读入向量。然而,这有一个缺点,即它遍历文件中的所有项目,如果big_n与声音一样大,那么这可能是性能问题。


但是,如果文件确实很大,我建议使用memory mapping来读取文件。

答案 1 :(得分:0)

这将使用

将文件读入矢量
#include <vector>
#include <fstream>
#include<iterator>
// ...

std::ifstream testFile("testfile", std::ios::binary);
std::vector<unsigned char> fileContents((std::istreambuf_iterator<unsigned char>(testFile)),
                           std::istreambuf_iterator<unsigned char>());

这个答案来自之前的答案:https://stackoverflow.com/a/4761779/942596