Efficient way of reading a file into an std::vectorlt;chargt;?(将文件读入 std::vectorchar 的有效方法?)
问题描述
我想避免不必要的副本.我的目标是:
I'd like to avoid unnecessary copies. I'm aiming for something along the lines of:
std::ifstream testFile( "testfile", "rb" );
std::vector<char> fileContents;
int fileSize = getFileSize( testFile );
fileContents.reserve( fileSize );
testFile.read( &fileContents[0], fileSize );
(这不起作用,因为 reserve
实际上并没有在向量中插入任何东西,所以我无法访问 [0]
).
(which doesn't work because reserve
doesn't actually insert anything into the vector, so I can't access [0]
).
当然,std::vector
有效,但初始化所有元素会产生开销(fileSize
可能相当大).resize()
也一样.
Of course, std::vector<char> fileContents(fileSize)
works, but there is an overhead of initializing all elements (fileSize
can be rather big). Same for resize()
.
这个问题与开销的重要性无关.相反,我只是想知道是否还有其他方法.
This question is not so much about how important that overhead would be. Rather, I'm just curious to know if there's another way.
推荐答案
规范形式是这样的:
#include<iterator>
// ...
std::ifstream testFile("testfile", std::ios::binary);
std::vector<char> fileContents((std::istreambuf_iterator<char>(testFile)),
std::istreambuf_iterator<char>());
如果您担心重新分配,请在向量中保留空间:
If you are worried about reallocations then reserve space in the vector:
#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>());
这篇关于将文件读入 std::vector<char> 的有效方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:将文件读入 std::vector<char> 的有效方法?


基础教程推荐
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- Windows Media Foundation 录制音频 2021-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- 从 std::cin 读取密码 2021-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- 使用从字符串中提取的参数调用函数 2022-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07