我发现我们可以将文件的内容读入 std::vector 中,如下所示:
ifstream fin(..., ios::in);
std::vector<char> buf(
std::istreambuf_iterator<char>(fin),
std::istreambuf_iterator<char>());
此方法是否会导致大量内存重新分配,就像我多次调用 buf.push_back();
一样?将文件读入 std::vector
的最快或最佳方法是什么?
编辑: 顺便说一句,我发现有一种方法可以将文件读入字符串流:
stringstream ss;
ifstream fin(..., ios::in);
fin >> ss.rdbuf();
这种方法会出现同样的内存重新分配问题吗?
最佳答案
std::istreambuf_iterator
是一个输入迭代器,因此提前不知道 begin 和 end 之间的距离。构造函数期间将会有多次重新分配,除非文件非常小。对于随机访问迭代器,距离是已知的,在这种情况下,构造函数可以避免额外的内存分配。
如果你大致知道文件的大小,可以使用 reserve()
阅读之前:
std::vector<char> buf;
buf.reserve(file_size);
buf.insert(buf.end(), std::istreambuf_iterator<char>(fin),
std::istreambuf_iterator<char>());
关于c++ - 这种方法会涉及内存重新分配从而影响其效率吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60485133/