我想避免不必要的副本.我的目标是:
std::ifstream testFile( "testfile", "rb" );
std::vector<char> fileContents;
int fileSize = getFileSize( testFile );
fileContents.reserve( fileSize );
testFile.read( &fileContents[0], fileSize );
Run Code Online (Sandbox Code Playgroud)
(这不起作用,因为reserve实际上没有在向量中插入任何东西,所以我无法访问[0]).
当然,std::vector<char> fileContents(fileSize)有效,但是初始化所有元素的开销(fileSize可能相当大).同样的resize().
这个问题与开销的重要程度无关.相反,我只是想知道是否有另一种方式.
wil*_*ell 59
规范形式是这样的:
#include<iterator>
// ...
std::ifstream testFile("testfile", std::ios::binary);
std::vector<char> fileContents((std::istreambuf_iterator<char>(testFile)),
std::istreambuf_iterator<char>());
Run Code Online (Sandbox Code Playgroud)
如果您担心重新分配,请在向量中保留空间:
#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>());
Run Code Online (Sandbox Code Playgroud)