最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C++ 存儲二進制數(shù)據(jù)容器的幾種方法

 更新時間:2025年12月03日 11:13:10   作者:永不落幕的物語  
本文主要介紹了詳解C++ 存儲二進制數(shù)據(jù)容器,包括std::vector、std::array、std::string、std::bitset和std::vector,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1.std::vector<uint8_t>(最常用)

std::vector 是動態(tài)數(shù)組容器,搭配 uint8_t(無符號8位整數(shù),即1字節(jié))是存儲二進制數(shù)據(jù)的首選方案,尤其適合長度不確定的二進制流(如文件內(nèi)容、網(wǎng)絡(luò)數(shù)據(jù)包)。

特點:

  • 動態(tài)大小:可隨數(shù)據(jù)量自動擴容,支持 push_back、resize 等操作,靈活處理變長二進制數(shù)據(jù)。
  • 連續(xù)內(nèi)存:元素在內(nèi)存中連續(xù)存儲,可通過 data() 方法獲取原始字節(jié)指針(uint8_t*),方便與 C 風(fēng)格接口(如系統(tǒng)調(diào)用、網(wǎng)絡(luò)函數(shù))交互。
  • C++11 增強:支持移動語義(std::move),避免大二進制數(shù)據(jù)的拷貝開銷;支持初始化列表({0x01, 0x02, 0x03})快速初始化。

適用場景:

  • 讀取文件二進制內(nèi)容(如圖片、音頻)。
  • 網(wǎng)絡(luò)通信中的緩沖區(qū)(發(fā)送/接收字節(jié)流)。
  • 動態(tài)生成的二進制數(shù)據(jù)(如加密后的字節(jié)序列)。

示例:

#include <vector>
#include <cstdint>  // 包含uint8_t

int main() {
    // 存儲二進制數(shù)據(jù)(例如一個簡單的協(xié)議包)
    std::vector<uint8_t> binary_data = {0x01, 0x02, 0xFF, 0x00};
    
    // 動態(tài)添加數(shù)據(jù)
    binary_data.push_back(0x03);
    
    // 獲取原始字節(jié)指針,用于C風(fēng)格接口
    uint8_t* raw_ptr = binary_data.data();
    size_t size = binary_data.size();  // 字節(jié)數(shù):5
    return 0;
}

2.std::array<uint8_t, N>(固定大小二進制數(shù)據(jù))

std::array 是 C++11 新增的固定大小數(shù)組容器,適合存儲長度已知且固定的二進制數(shù)據(jù)(如協(xié)議頭、固定大小的校驗碼)。

特點:

  • 編譯期固定大小:聲明時需指定長度(如 std::array<uint8_t, 16> 表示16字節(jié)),內(nèi)存分配在棧上(或靜態(tài)區(qū)),無需動態(tài)內(nèi)存管理。
  • 連續(xù)內(nèi)存:同 vector,支持 data() 獲取原始指針,性能優(yōu)于動態(tài)數(shù)組。
  • 無額外開銷:相比 vector 沒有動態(tài)擴容的額外內(nèi)存(如容量管理的指針),空間效率更高。

適用場景:

  • 固定格式的二進制協(xié)議頭(如16字節(jié)的TCP頭部部分字段)。
  • 哈希值、UUID等固定長度的二進制數(shù)據(jù)(如16字節(jié)的MD5結(jié)果)。
  • 嵌入式系統(tǒng)中對內(nèi)存分配有嚴格限制的場景。

示例:

#include <array>
#include <cstdint>

int main() {
    // 存儲16字節(jié)的固定二進制數(shù)據(jù)(如UUID)
    std::array<uint8_t, 16> uuid = {
        0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
        0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF
    };
    
    // 訪問單個字節(jié)
    uint8_t first_byte = uuid[0];  // 0x00
    return 0;
}

3.std::string(兼容字符串操作的二進制數(shù)據(jù))

std::string 本質(zhì)是“字節(jié)序列容器”(C++標(biāo)準(zhǔn)未限制必須是字符串),可存儲包含空字符(\0)的二進制數(shù)據(jù),適合需要同時支持字符串操作和二進制存儲的場景。

特點:

  • 兼容字符串API:可使用 substr、find 等方法處理二進制數(shù)據(jù)中的片段,方便解析包含文本標(biāo)識的二進制流(如HTTP協(xié)議中的二進制附件)。
  • 連續(xù)內(nèi)存:支持 data()c_str() 獲取字節(jié)指針(注意 c_str() 會在末尾附加 \0,但 data() 在C++11中與 c_str() 等效,需謹慎處理)。
  • 注意事項:二進制數(shù)據(jù)中的 \0 不會被視為“結(jié)束符”,size() 方法會返回真實字節(jié)數(shù)(包含 \0)。

適用場景:

  • 存儲包含文本和二進制混合的數(shù)據(jù)(如郵件中的MIME附件)。
  • 需要對二進制數(shù)據(jù)進行子串查找、拼接等操作的場景。

示例:

#include <string>
#include <cstdint>

int main() {
    // 存儲包含空字符的二進制數(shù)據(jù)
    std::string binary_str;
    binary_str += static_cast<char>(0x01);
    binary_str += static_cast<char>(0x00);  // 空字符,仍會被計入長度
    binary_str += static_cast<char>(0x02);
    
    std::cout << "長度:" << binary_str.size();  // 輸出3(包含空字符)
    return 0;
}

4.std::bitset<N>(固定大小比特序列)

std::bitset 用于存儲固定長度的比特(bit)序列(而非字節(jié)),適合需要精確控制每一個比特的場景(如標(biāo)志位、壓縮存儲布爾值)。

特點:

  • 比特級操作:支持單個比特的設(shè)置(set)、清空(reset)、翻轉(zhuǎn)(flip),以及批量邏輯運算(與、或、異或)。
  • 編譯期固定大小:長度 N 必須是編譯期常量(如 std::bitset<32> 表示32個比特)。
  • 空間高效:每個比特僅占1/8字節(jié),比 vector<bool> 更高效(無額外指針開銷)。

適用場景:

  • 存儲大量布爾標(biāo)志(如32個狀態(tài)標(biāo)志僅需4字節(jié))。
  • 協(xié)議中的比特位字段(如TCP頭部的控制位:SYN、ACK等)。
  • 比特級算法(如位掩碼、壓縮算法)。

示例:

#include <bitset>

int main() {
    // 32位比特序列,存儲標(biāo)志位
    std::bitset<32> flags;
    
    // 設(shè)置第0位和第2位(從0開始)
    flags.set(0);
    flags.set(2);
    
    // 檢查第0位是否為1
    bool is_set = flags.test(0);  // true
    
    // 整體轉(zhuǎn)換為整數(shù)(獲取比特序列的數(shù)值)
    uint32_t value = flags.to_ulong();  // 二進制101 → 十進制5
    return 0;
}

5.std::vector<bool>(動態(tài)比特序列)

std::vector<bool>vector 的特化版本,用于存儲動態(tài)長度的比特序列,本質(zhì)是“比特容器”(每個元素占1比特)。

特點:

  • 動態(tài)大小:長度可在運行時調(diào)整(如 push_back 添加比特),適合比特數(shù)不確定的場景。
  • 空間優(yōu)化:比 vector<uint8_t> 節(jié)省空間(存儲1000個布爾值僅需約125字節(jié))。
  • 注意事項:迭代器行為特殊(返回代理對象而非直接引用),部分操作效率可能低于 std::bitsetvector<uint8_t>。

適用場景:

  • 動態(tài)生成的比特流(如編碼算法輸出的可變長度比特序列)。
  • 存儲數(shù)量不確定的布爾狀態(tài)(如動態(tài)篩選結(jié)果的標(biāo)志)。

示例:

#include <vector>

int main() {
    // 動態(tài)比特序列
    std::vector<bool> bits;
    
    // 添加比特
    bits.push_back(true);   // 第0位:1
    bits.push_back(false);  // 第1位:0
    bits.push_back(true);   // 第2位:1
    
    // 訪問第2位
    bool bit2 = bits[2];  // true
    return 0;
}

總結(jié)

C++ 中存儲二進制數(shù)據(jù)的核心選擇及適用場景:

數(shù)據(jù)結(jié)構(gòu)存儲單位大小特性核心優(yōu)勢適用場景
std::vector<uint8_t>字節(jié)動態(tài)大小靈活、連續(xù)內(nèi)存、適合變長數(shù)據(jù)網(wǎng)絡(luò)緩沖區(qū)、文件內(nèi)容、動態(tài)字節(jié)流
std::array<uint8_t, N>字節(jié)固定大小(編譯期)無動態(tài)開銷、棧上分配協(xié)議頭、固定長度哈希/UUID
std::string字節(jié)動態(tài)大小兼容字符串操作,支持混合數(shù)據(jù)文本+二進制混合數(shù)據(jù)、帶標(biāo)識的字節(jié)流
std::bitset<N>比特固定大?。ň幾g期)高效比特操作、空間緊湊標(biāo)志位、固定長度比特字段
std::vector<bool>比特動態(tài)大小動態(tài)調(diào)整比特數(shù),空間優(yōu)化變長比特流、動態(tài)布爾狀態(tài)集合

根據(jù)需求選擇:動態(tài)字節(jié)流優(yōu)先用 vector<uint8_t>,固定字節(jié)用 array,比特級操作選 bitsetvector<bool>,混合文本和二進制用 std::string。

到此這篇關(guān)于詳解C++ 存儲二進制數(shù)據(jù)容器的幾種方法的文章就介紹到這了,更多相關(guān)C++ 存儲二進制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文讀懂C++中Protobuf

    一文讀懂C++中Protobuf

    Protocol Buffers 是一種輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲格式,可以用于結(jié)構(gòu)化數(shù)據(jù)串行化、或者說序列化,本文詳解了Protobuf的使用,具有一定的參考價值,感興趣的可以了解一下
    2023-05-05
  • 淺析C/C++中sort函數(shù)的用法

    淺析C/C++中sort函數(shù)的用法

    做項目的時候,排序是一種經(jīng)常要用到的操作。如果每次都自己寫個冒泡之類的O(n^2)排序,不但程序容易超時,而且浪費寶貴的時間,還很有可能寫錯。STL里面有個sort函數(shù),可以直接對數(shù)組排序,復(fù)雜度為n*log2(n)。
    2014-09-09
  • C++實現(xiàn)貪吃蛇游戲

    C++實現(xiàn)貪吃蛇游戲

    這篇文章主要為大家詳細介紹了C++實現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C語言單鏈表實現(xiàn)圖書管理系統(tǒng)

    C語言單鏈表實現(xiàn)圖書管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言單鏈表實現(xiàn)圖書管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • c++中移動語義和完美轉(zhuǎn)發(fā)及易錯點

    c++中移動語義和完美轉(zhuǎn)發(fā)及易錯點

    C++ 中的移動語義和完美轉(zhuǎn)發(fā)是 C++11 引入的兩個重要特性,它們分別用于提高性能和靈活性,這篇文章主要介紹了c++中移動語義和完美轉(zhuǎn)發(fā),需要的朋友可以參考下
    2023-09-09
  • C語言數(shù)據(jù)結(jié)構(gòu)之滿二叉樹、完全二叉樹的節(jié)點數(shù)計算詳解

    C語言數(shù)據(jù)結(jié)構(gòu)之滿二叉樹、完全二叉樹的節(jié)點數(shù)計算詳解

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之滿二叉樹、完全二叉樹節(jié)點數(shù)計算的相關(guān)資料,通過代碼示例詳細展示了如何計算這兩種二叉樹的節(jié)點數(shù)量,包括總節(jié)點數(shù)、葉子數(shù)、度為1和度為2的節(jié)點數(shù),需要的朋友可以參考下
    2026-01-01
  • C++?Boost?Spirit精通教程

    C++?Boost?Spirit精通教程

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • 詳解如何用alpine鏡像做一個最小的鏡像并運行c++程序

    詳解如何用alpine鏡像做一個最小的鏡像并運行c++程序

    這篇文章主要介紹了詳解如何用alpine鏡像做一個最小的鏡像并運行c++程序,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • C語言動態(tài)內(nèi)存管理的原理及實現(xiàn)方法

    C語言動態(tài)內(nèi)存管理的原理及實現(xiàn)方法

    C語言動態(tài)內(nèi)存管理的原理是通過 malloc() 函數(shù)申請一塊連續(xù)的內(nèi)存空間,并返回其地址,通過 free() 函數(shù)釋放該內(nèi)存空間。實現(xiàn)方法是通過在程序運行時動態(tài)地管理內(nèi)存,即在需要內(nèi)存時申請,不需要時釋放,避免了靜態(tài)內(nèi)存分配的浪費和不足
    2023-04-04
  • C語言用數(shù)組實現(xiàn)反彈球消磚塊

    C語言用數(shù)組實現(xiàn)反彈球消磚塊

    這篇文章主要為大家詳細介紹了C語言用數(shù)組實現(xiàn)反彈球消磚塊,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評論

彝良县| 西充县| 清水河县| 右玉县| 邢台市| 天台县| 怀远县| 阜宁县| 名山县| 连江县| 霍城县| 鄂伦春自治旗| 肃宁县| 淅川县| 江西省| 类乌齐县| 滕州市| 赤壁市| 蒲江县| 兴仁县| 禄丰县| 湟中县| 巴马| 奈曼旗| 铁力市| 曲沃县| 闻喜县| 银川市| 澄迈县| 安溪县| 旬邑县| 大足县| 连州市| 肃北| 潞城市| 瓮安县| 精河县| 莱芜市| 车致| 周宁县| 洪雅县|