将文件读入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()

这个问题并不那么重要,这将是开销。 相反,我只是想知道是否有另一种方式。

规范forms是这样的:

 #include<iterator> // ... std::ifstream testFile("testfile", std::ios::binary); std::vector<char> fileContents((std::istreambuf_iterator<char>(testFile)), 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), std::istreambuf_iterator<char>()); 

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

如果我正确理解你,你想读取每个元素,但不想将它们全部加载到fileContents ,对吗? 我个人不认为这会造成不必要的副本,因为多次打开文件会降低性能。 在这种情况下,只读入fileContents向量是一个合理的解决scheme。