C++的std::vector<bool>轉(zhuǎn)儲文件問題
前言
總所周知,C++的std::vector<bool>并不是一種“標準”的容器。
該容器按位存儲數(shù)據(jù),使用at(size_t)或者其重載的operator[](size_t)返回的都是一個特化的Reference類,使用begin()之類的函數(shù)也是特殊的迭代器。
而且不同的編譯器,其標準庫的實現(xiàn)方式也不一樣。如此,直接將數(shù)據(jù)std::vector<bool>轉(zhuǎn)儲到文件似乎就顯得不可能了。
那么是否有方法可以進行轉(zhuǎn)儲呢?答案是有的,只要能找到存儲數(shù)據(jù)的起始指針即可將數(shù)據(jù)轉(zhuǎn)儲。
獲取數(shù)據(jù)源地址
MSVC
1、微軟沒有實現(xiàn)data()函數(shù)的接口。
2、微軟直接暴露(public)了存儲std::vector<bool>的std::vector<unsigned int>。
3、微軟的迭代器直接暴露(public)了迭代器指向的數(shù)據(jù)指針。
GCC
1、GCC偏特化實現(xiàn)了data()函數(shù)接口,但返回是void。
2、GCC提供了訪問直接存儲數(shù)據(jù)的一個結(jié)構(gòu)化表述類的接口,但真的很不優(yōu)雅。
3、GCC的迭代器同樣直接暴露了迭代器指向的數(shù)據(jù)指針。
數(shù)據(jù)地址獲取方法
auto GetBoolVectorStartAddress(std::vector<bool>& vec) {
#ifdef __GNUC__
/*方法一
auto begin = vec.begin();
return begin._M_p;
*/
//方法二
auto Impl = vec._M_get_Bit_allocator(); //獲取_Bvector_impl類型的_M_impl;
return Impl._M_start._M_p; //Impl._M_start就是begin返回的迭代器
#else
/*方法一
auto& source = vec._Myvec;
return &source[0];*/
//方法二
auto begin = vec.begin();
return begin._Myptr;
#endif
}
#include<fstream>
int mian(){
std::vector<bool> test;
for(int i = 0; i < 65536; i++)
{
test.push_back(i % 2 ? true : false);
}
auto StartAddress = GetBoolVectorStartAddress(test);
std::ofstream ofs("test.bin", std::ios::binary|std::ios::out);
ofs.write((char*)StartAddress, 8192);
ofs.close();
return 0;
}結(jié)果

總結(jié)
將std::vector<bool>轉(zhuǎn)儲文件的方法很簡單,只要找到相應的起始位置的指針,在將數(shù)據(jù)直接使用流輸出即可。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
用C++實現(xiàn),將一句話里的單詞進行倒置的方法詳解
本篇文章是對用C++實現(xiàn),將一句話里的單詞進行倒置的方法進行了詳細的分析介紹,需要的朋友參考下2013-05-05
c++ 獲取數(shù)字字符串的子串數(shù)值性能示例分析
這篇文章主要為大家介紹了c++ 獲取數(shù)字字符串的子串數(shù)值示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11
C++指針和數(shù)組:字符和字符串、字符數(shù)組的關(guān)聯(lián)和區(qū)別
字符串是一種重要的數(shù)據(jù)類型,但是c語言并沒有顯示的字符串數(shù)據(jù)類型,因為字符串以字符串常量的形式出現(xiàn)或者存儲于字符數(shù)組中。在C++標準模板庫(STL)中提供了string類,實現(xiàn)了對字符串的封裝。2022-12-12

