将文件读入std :: vector <char>的有效方法?

我想避免不必要的复制。我的目标是:


std::ifstream testFile( "testfile", "rb" );

std::vector<char> fileContents;

int fileSize = getFileSize( testFile );

fileContents.reserve( fileSize );

testFile.read( &fileContents[0], fileSize );

(这是行不通的,因为reserve实际上并未在向量中插入任何内容,因此我无法访问[0])。


当然std::vector<char> fileContents(fileSize)可以,但是初始化所有元素会产生开销(fileSize可能会很大)。相同resize()。


这个问题并不是关于开销有多重要。相反,我只是想知道是否还有另一种方法。


斯蒂芬大帝
浏览 1225回答 3
3回答

叮当猫咪

规范形式是这样的:#include<iterator>// ...std::ifstream testFile("testfile", std::ios::binary);std::vector<char> fileContents((std::istreambuf_iterator<char>(testFile)),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;std::istreambuf_iterator<char>());如果您担心重新分配,请在向量中保留空间:#include<iterator>// ...std::ifstream testFile("testfile", std::ios::binary);std::vector<char> fileContents;fileContents.reserve(fileSize);fileContents.assign(std::istreambuf_iterator<char>(testFile),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; std::istreambuf_iterator<char>());

噜噜哒

如果要进行真正的零拷贝读取,也就是说,要消除从内核到用户空间的复制,只需将文件映射到内存即可。编写自己的映射文件包装器,或使用中的一个boost::interprocess。

BIG阳

如果我对您的理解正确,那么您想阅读每个元素,但又不想将所有元素都加载到fileContents,对吗?我个人认为这不会产生不必要的副本,因为多次打开文件会进一步降低性能。fileContents在这种情况下,一次读入向量是一个合理的解决方案。
打开App,查看更多内容
随时随地看视频慕课网APP