![](/img/trans.png)
[英]How do I serialise/deserialise a std::vector<bool> most efficiently?
[英]How to do file I/O with std::vector<bool>?
我需要實現一個布爾數據容器,該容器將存儲大量變量。 我想我可以只使用char*
並實現C樣式的宏訪問器,但我希望將其包裝在std::
結構中。 std::bitset<size_t>
似乎不切實際,因為它在編譯期間具有固定大小。
這樣就留給我std::vector<bool>
,這是為空間優化的; 它有一個不錯的布爾型訪問器。
有沒有辦法像直接將指針從fwrite()
饋給fwrite()
嗎?
以及如何將文件輸入到這樣的向量中?
最后,當需要大量文件I / O時,它是否是一個好的數據結構?
隨機文件訪問( fseek
等)呢?
編輯:我決定將std::vector<unsigned int>
包裝在具有我的需求所要求的功能的新類中。
- 有沒有辦法像直接將指針從ffeed()饋給fwrite()一樣?
不,但是您可以使用std::fstream
做到這一點
std::ofstream f("output.file");
std::copy(vb.begin(), vb.end(), std::ostream_iterator<bool>(f, " "));
- 以及如何將文件輸入到這樣的向量中?
使用std::fstream
std::ifstream f("input.file");
std::copy(std::istream_iterator<bool>(f), {}, std::back_inserter(vb));
- 最后,當需要大量文件I / O時,它是否是一個好的數據結構?
不, vector<bool>
很少是用於任何目的的良好數據結構。 參見http://howardhinnant.github.io/onvectorbool.html
- 隨機文件訪問(fseek等)呢?
那呢
您可以使用std::vector<char>
,將其大小調整為文件大小(或其他大小,例如要處理固定長度的塊),然后可以將其內容傳遞給fread()
類的函數。或fwrite()
以下列方式:
std::vector<char> fileContents;
fileContents.resize(100);
fread(&fileContents[0], 1, 100, theFileStream);
實際上,這只允許您使用C ++樣式調整大小的char數組。 也許這是一個有用的起點? 關鍵是您可以直接訪問向量后面的內存,因為可以保證它像數組一樣順序地放置。
同樣的概念將工作一個
std::vector<bool>
-當我只是要小心
fread
荷蘭國際集團到這是從我的頭頂,我不能告訴你有多大(
sizeof
一個明智的)
bool
是,作為它取決於平台(例如,如果您在微控制器上工作,則為8位,16位和32位)。
似乎std::vector<bool>
可以優化為將每個布爾存儲在單個位中,因此,除非您知道它將起作用,否則絕對不要嘗試直接使用vector<bool>
后面的內存!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.