如何直接将一大块内存读入std::vector

How to directly read a huge chunk of memory into std::vector?

本文关键字:std 内存 vector 何直接      更新时间:2023-10-16

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

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

通过搜索,我想我可能不得不以某种形式使用新位置,但我不确定电话和所有权问题的顺序。另外,我是否需要担心对齐问题?

我正在测试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 );

您使用std::vector构造函数设置vector的大小,并使用std::vector::data获取指向已分配内存的指针。

使用fread:

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

正如其他人所指出的,如果类型T不是POD类型,那么使用fread很可能不起作用。然后可以使用c++流和std::istreambuf_iterator将文件读入vector。然而,这有一个缺点,它循环遍历文件中的所有项,如果big_n像听起来那么大,那么这可能是一个性能问题。


但是,如果文件确实很大,我更建议使用内存映射来读取文件

这将使用

将文件读入vector
#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