在某些情况下,将文件读入 std::vector
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中文网其他相关文章!