亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將文件讀入std :: vector <char>的有效方法?

將文件讀入std :: vector <char>的有效方法?

C++
斯蒂芬大帝 2019-10-21 09:42:14
我想避免不必要的復制。我的目標是: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()。這個問題并不是關于開銷有多重要。相反,我只是想知道是否還有另一種方法。
查看完整描述

3 回答

?
叮當貓咪

TA貢獻1776條經驗 獲得超12個贊

規范形式是這樣的:


#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>());


查看完整回答
反對 回復 2019-10-21
?
嚕嚕噠

TA貢獻1784條經驗 獲得超7個贊

如果要進行真正的零拷貝讀取,也就是說,要消除從內核到用戶空間的復制,只需將文件映射到內存即可。編寫自己的映射文件包裝器,或使用中的一個boost::interprocess


查看完整回答
反對 回復 2019-10-21
?
BIG陽

TA貢獻1859條經驗 獲得超6個贊

如果我對您的理解正確,那么您想閱讀每個元素,但又不想將所有元素都加載到fileContents,對嗎?我個人認為這不會產生不必要的副本,因為多次打開文件會進一步降低性能。fileContents在這種情況下,一次讀入向量是一個合理的解決方案。


查看完整回答
反對 回復 2019-10-21
  • 3 回答
  • 0 關注
  • 1269 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號