首页 > 后端开发 > C++ > 如何高效地将文件读入 std::vector?

如何高效地将文件读入 std::vector?

Susan Sarandon
发布: 2024-11-09 18:13:02
原创
192 人浏览过

How to Efficiently Read a File into a std::vector?

高效地将文件读入 std::vector

在某些情况下,将文件读入 std::vector高效对于避免不必要的复制和开销至关重要。一种方法是使用reserve()方法为向量分配空间,然后使用read()来填充向量。

std::ifstream testFile("testfile", "rb");
std::vector<char> fileContents;
int fileSize = getFileSize(testFile);
fileContents.reserve(fileSize);
testFile.read(&fileContents[0], fileSize);
登录后复制

但是,当使用reserve()调整向量大小时,这种方法会失败,因为它实际上并未将元素插入向量中。因此,尝试访问 fileContents[0] 将导致错误。

使用迭代器的替代方法

更全面的解决方案涉及使用迭代器。使用输入文件流,以下代码片段可以实现高效的文件读取:

#include<iterator>

//...

std::ifstream testFile("testfile", std::ios::binary);
std::vector<char> fileContents((std::istreambuf_iterator<char>(testFile)),
                              std::istreambuf_iterator<char>());
登录后复制

此方法利用 istreambuf_iterator 迭代输入文件流并将元素直接插入到向量中。

处理重新分配

如果重新分配是一个问题,reserve() 可用于在向量中预先分配空间:

#include<iterator>

//...

std::ifstream testFile("testfile", std::ios::binary);
std::vector<char> fileContents;
fileContents.reserve(fileSize);
fileContents.assign(std::istreambuf_iterator<char>(testFile),
                     std::istreambuf_iterator<char>());
登录后复制

在此变体中,reserve() 用于基于分配空间在已知的文件大小上,使用 allocate() 来使用迭代器填充向量。

以上是如何高效地将文件读入 std::vector?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板