C++的std::vector<bool>轉(zhuǎn)儲(chǔ)文件問(wèn)題
前言
總所周知,C++的std::vector<bool>并不是一種“標(biāo)準(zhǔn)”的容器。
該容器按位存儲(chǔ)數(shù)據(jù),使用at(size_t)或者其重載的operator[](size_t)返回的都是一個(gè)特化的Reference類,使用begin()之類的函數(shù)也是特殊的迭代器。
而且不同的編譯器,其標(biāo)準(zhǔn)庫(kù)的實(shí)現(xiàn)方式也不一樣。如此,直接將數(shù)據(jù)std::vector<bool>轉(zhuǎn)儲(chǔ)到文件似乎就顯得不可能了。
那么是否有方法可以進(jìn)行轉(zhuǎn)儲(chǔ)呢?答案是有的,只要能找到存儲(chǔ)數(shù)據(jù)的起始指針即可將數(shù)據(jù)轉(zhuǎn)儲(chǔ)。
獲取數(shù)據(jù)源地址
MSVC
1、微軟沒(méi)有實(shí)現(xiàn)data()函數(shù)的接口。
2、微軟直接暴露(public)了存儲(chǔ)std::vector<bool>的std::vector<unsigned int>。
3、微軟的迭代器直接暴露(public)了迭代器指向的數(shù)據(jù)指針。
GCC
1、GCC偏特化實(shí)現(xiàn)了data()函數(shù)接口,但返回是void。
2、GCC提供了訪問(wèn)直接存儲(chǔ)數(shù)據(jù)的一個(gè)結(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)儲(chǔ)文件的方法很簡(jiǎn)單,只要找到相應(yīng)的起始位置的指針,在將數(shù)據(jù)直接使用流輸出即可。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
教你在VS2022?MFC程序中調(diào)用CUDA代碼的方法
這篇文章主要介紹了在VS2022?MFC程序中調(diào)用CUDA代碼,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
C語(yǔ)言中強(qiáng)制類型轉(zhuǎn)換的常見(jiàn)方法
強(qiáng)制類型轉(zhuǎn)換是一種將一個(gè)數(shù)據(jù)類型轉(zhuǎn)換為另一個(gè)數(shù)據(jù)類型的方法,這篇文章主要為大家整理了C語(yǔ)言中強(qiáng)制類型轉(zhuǎn)換的方法,需要的可以參考一下2023-05-05
QT如何通過(guò)鼠標(biāo)事件實(shí)現(xiàn)圖片的拖動(dòng)和縮放
本文介紹了如何通過(guò)鼠標(biāo)拖動(dòng)移動(dòng)圖片以及使用鼠標(biāo)滾輪進(jìn)行圖片縮放的技術(shù)實(shí)現(xiàn),包括完整的解決方案,ImageWidget.h、ImageWidget.cpp和main.cpp的編寫(xiě),以及詳細(xì)的函數(shù)解釋,如paintEvent()重繪圖片,以及平滑縮放和偏移量的應(yīng)用等,需要的朋友可以參考下2024-10-10
C++實(shí)現(xiàn)簡(jiǎn)單的ls命令及其原理
這篇文章主要介紹了C++實(shí)現(xiàn)簡(jiǎn)單的ls命令及其原理,C++實(shí)現(xiàn)ls命令可通過(guò)調(diào)用系統(tǒng)函數(shù)實(shí)現(xiàn)讀取目錄中的文件名和屬性,再通過(guò)標(biāo)準(zhǔn)輸出進(jìn)行顯示,需要的朋友可以參考下2023-05-05
C語(yǔ)言實(shí)現(xiàn)設(shè)備管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)設(shè)備管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
C/C++實(shí)現(xiàn)獲取系統(tǒng)時(shí)間的示例代碼
C 標(biāo)準(zhǔn)庫(kù)提供了 time() 函數(shù)與 localtime() 函數(shù)可以獲取到當(dāng)前系統(tǒng)的日歷時(shí)間。本文將通過(guò)一些簡(jiǎn)單的示例為大家講講C++獲取系統(tǒng)時(shí)間的具體方法,需要的可以參考一下2022-12-12

