C++ bitset 模板類

bitset<256> 數據類型詳解

bitset<256> 是 C++ 標準庫中的一個模板類,用于處理固定大小的位集合(Bit Set)。它可以高效地操作和存儲二進制位,特別適合需要處理大量布爾標志或簡單計數的場景。

基本定義與特性

1. 模板參數

bitset<N> 中的 N 表示位集合的固定大小(必須是編譯時常量)。例如:

  • bitset<8>:8 位(1 字節)的位集合
  • bitset<256>:256 位(32 字節)的位集合
2. 核心特性
  • 按位存儲:每個位僅占 1 位內存,空間效率極高。
  • 編譯時確定大小:大小在編譯期確定,不支持運行時動態調整。
  • 位操作支持:提供按位與、或、異或、取反等操作。

在 LeetCode 266 中的應用

在判斷回文排列的問題中,bitset<256> 用于記錄字符出現次數的奇偶性:

bitset<256> bits;  // 256 位,對應 ASCII 字符集的 256 個字符for (char c : s) {bits.flip(c);  // 每次遇到字符 c,翻轉其對應位(0變1,1變0)
}return bits.count() <= 1;  // 統計1的個數(奇數次字符的數量)
工作原理
  • 每個字符的 ASCII 碼(0~255)對應 bitset<256> 中的一個位。
  • 字符首次出現時,對應位設為 1(奇數次);再次出現時,對應位設為 0(偶數次)。
  • 最終 bits.count() 返回值為 1 的位的數量,即出現奇數次的字符數量。

常用操作與方法

1. 位操作
方法描述
flip(pos)翻轉位置 pos 的位(0→1 或 1→0)
set(pos, val)將位置 pos 設為 val(默認 1)
reset(pos)將位置 pos 設為 0
test(pos)檢查位置 pos 是否為 1,返回 bool
operator[](pos)訪問位置 pos 的位(可讀可寫)
2. 統計與查詢
方法描述
count()返回位集合中 1 的個數
size()返回位集合的大小(模板參數 N)
any()檢查是否至少有一個位為 1
none()檢查所有位是否為 0
3. 位運算

支持按位與(&)、或(|)、異或(^)、取反(~)等運算符。

示例:bitset 基本操作

#include <bitset>
#include <iostream>int main() {// 創建 8 位的 bitsetstd::bitset<8> bits;// 設置位bits.set(0, 1);  // 第 0 位設為 1bits.set(3);     // 第 3 位設為 1(默認值 1)// 翻轉位bits.flip(3);    // 第 3 位從 1 變 0// 訪問位std::cout << "第 0 位: " << bits[0] << std::endl;  // 輸出: 1std::cout << "第 3 位: " << bits[3] << std::endl;  // 輸出: 0// 統計std::cout << "1的個數: " << bits.count() << std::endl;  // 輸出: 1std::cout << "二進制表示: " << bits << std::endl;       // 輸出: 00000001return 0;
}

與其他數據結構的對比

數據結構bitset<N>unordered_maparray<int, N>
空間效率極高(每位 1 位)中等(鍵值對存儲)中等(每個元素至少 4 字節)
查詢效率O(1)(直接位訪問)O(1)(平均)O(1)
動態性編譯時固定大小動態擴容固定大小
適用場景固定大小的位操作、奇偶性標記鍵值映射、動態數據固定大小的數值統計

總結

bitset<256> 是一種高效的位操作工具,特別適合:

  • 處理已知范圍的離散值(如 ASCII 字符集)。
  • 需要標記奇偶性、存在性的場景。
  • 追求極致空間效率的算法(如回文排列判斷、布隆過濾器)。

在 LeetCode 266 題中,它通過位翻轉操作巧妙地統計了奇數次字符的數量,代碼簡潔且效率極高。

另: 關于256

bitset<256> 中數字 256 的充足性分析

在計算機科學中,256 是一個非常關鍵的數值,它在字符編碼、位操作等場景中具有特殊意義。以下從多個維度分析 256 的充足性:

1. 字符編碼層面:完全覆蓋常用字符集

  • ASCII 碼范圍:標準 ASCII 碼使用 7 位表示 128 個字符(0~127),擴展 ASCII 碼用 8 位表示 256 個字符(0~255)。

    • 常見字符(字母、數字、符號、控制字符)均包含在 0~127 范圍內。
    • 擴展 ASCII 碼覆蓋了西歐語言字符、特殊符號等(如 ? 等)。
  • 實際應用場景
    在 LeetCode 266 題(回文排列)中,輸入字符串通常由常見字符組成,256 足以覆蓋所有可能出現的字符。即使處理包含擴展 ASCII 字符的字符串,256 也能完全容納。

2. 位操作層面:空間與效率的平衡

  • 空間占用bitset<256> 占用 32 字節(256位),相比其他數據結構(如 unordered_map)節省大量空間。

    • 若使用 int[256],需占用 1024 字節(256×4字節),空間開銷是 bitset 的 32 倍。
    • 若使用 unordered_map<char, int>,每個鍵值對至少占用 24 字節(含哈希表開銷),存儲 256 個字符時空間開銷更大。
  • 操作效率:位操作(如 flipcount)是硬件級指令,效率極高。例如:

    bitset<256> bits;
    bits.flip(c);  // 直接操作第 c 位,時間復雜度 O(1)
    

    這種效率是哈希表或數組無法比擬的。

3. 邊界情況驗證:極端輸入的覆蓋能力

  • 最大字符值測試
    當字符為 char 類型的最大值(即 255,二進制 11111111)時,bitset<256> 的第 255 位會被正確操作,不會越界。

    • 若使用 bitset<128>,則無法處理擴展 ASCII 字符(128~255),導致漏判。
  • 多語言字符場景
    若輸入包含 Unicode 字符(如中文、日文等),char 類型只能存儲其 UTF-8 編碼的部分字節(每個 Unicode 字符可能占用 2~4 字節)。此時:

    • 若直接用 char 類型遍歷字符串,會將多字節字符拆分為多個單字節處理,導致 bitset<256> 誤判。
    • 但在 LeetCode 此類題目中,輸入通常為單字節字符(如英文、數字),256 足夠使用。
    • 若需處理 Unicode 字符,需改用 wchar_tchar32_t,并調整 bitset 大小(如 bitset<65536> 對應 UTF-16)。

4. 與其他數值的對比:為什么不用更大或更小的數?

數值優勢劣勢適用場景
128空間更小(16字節)無法處理擴展ASCII字符(128~255)僅處理標準ASCII字符的場景
256覆蓋擴展ASCII,空間與功能平衡-大多數字符處理場景(如LeetCode題目)
512可處理部分Unicode空間增加(64字節),浪費資源特殊編碼格式(如部分自定義協議)
65536覆蓋UTF-16字符集空間大幅增加(8KB),效率降低處理Unicode字符的嚴格場景

5. 實際應用案例:LeetCode 中的典型場景

  • 回文排列(LeetCode 266)
    題目要求判斷字符串是否可以重新排列成回文,核心邏輯是:最多一個字符出現奇數次

    • 使用 bitset<256> 時,每個字符的 ASCII 碼對應一個位,翻轉操作記錄奇偶性,最終統計 1 的個數。
    • 若輸入包含擴展 ASCII 字符(如 ?,ASCII 碼 241),bitset<256> 仍能正確處理。
  • 同構字符串(LeetCode 205)
    雖然該題更適合用哈希表,但如果用 bitset256 也足以記錄兩個字符串的字符映射關系。

結論:256 是字符處理場景的理想選擇

  • 充足性:完全覆蓋 ASCII 及擴展 ASCII 字符集,滿足 99% 以上的字符處理需求。
  • 高效性:32 字節的固定空間開銷,搭配硬件級位操作,效率極高。
  • 通用性:在 LeetCode 等算法題目中,bitset<256> 是處理字符奇偶性、存在性的標準方案。

擴展建議:若需處理 Unicode 字符,可改用 bitset<65536>(對應 UTF-16)或 bitset<1114112>(對應 UTF-32),但需注意空間開銷的顯著增加。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/89781.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/89781.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/89781.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

通信握手言和:PROFINET轉EtherCAT網關讓汽輪機振動數據“破壁”傳輸

某大型電廠的關鍵汽輪機設備采用EtherCAT振動傳感器進行實時監測&#xff0c;但由于工廠PLC振動分析系統基于PROFINET協議&#xff0c;數據無法直接接入&#xff0c;導致振動數據延遲、預警滯后&#xff0c;嚴重影響設備健康管理。傳統的人工巡檢和定期維護難以捕捉早期機械故障…

golang 中當 JSON 數據缺少結構體(struct)中定義的某些字段,會有異常嗎

目錄關鍵影響示例演示潛在問題與解決方案問題 1&#xff1a;邏輯錯誤&#xff08;零值干擾&#xff09;問題 2&#xff1a;忽略可選字段問題 3&#xff1a;第三方庫驗證最佳實踐總結在 Go 語言中&#xff0c;當 JSON 數據缺少結構體&#xff08;struct&#xff09;中定義的某些…

Fiddler 中文版怎么配合 Postman 與 Wireshark 做多環境接口調試?

現代項目中&#xff0c;開發、測試、預發布、生產環境往往分離配置&#xff0c;前端在開發過程中需要頻繁切換接口域名、驗證多環境表現。而接口升級或項目迭代時&#xff0c;還需要做回歸測試&#xff0c;確保老版本接口仍能兼容&#xff0c;避免線上事故。這些環節若僅靠代碼…

釘釘小程序開發技巧:getSystemInfo 系統信息獲取全解析

在釘釘小程序開發中&#xff0c;獲取設備系統信息是實現跨平臺適配和優化用戶體驗的關鍵環節。本文將深入解析 dd.getSystemInfo 接口的使用方法、技術細節與實際應用場景&#xff0c;幫助開發者高效應對多終端開發挑戰。一、接口功能與核心價值dd.getSystemInfo 是釘釘小程序提…

Java項目Maven配置JDK1.8全攻略

目錄 &#x1f9e9; 一、全局環境變量配置&#xff08;推薦系統級統一&#xff09; ?? 二、Maven全局配置&#xff08;多項目統一&#xff09; &#x1f4c2; 三、項目級配置&#xff08;推薦團隊協作&#xff09; &#x1f4bb; 四、IDE配置&#xff08;輔助驗證&#x…

使用tensorflow的線性回歸的例子(六)

波士頓房價 import matplotlib.pyplot as plt %matplotlib inline import tensorflow as tf import numpy as np from sklearn.datasets import load_boston import sklearn.linear_model as sk boston load_boston() features np.array(boston.data) labels np.arra…

YOLOv11深度解析:Ultralytics新一代目標檢測架構創新與實戰指南

?? 2024年Ultralytics重磅推出YOLOv11**:在精度與速度的平衡木上再進一步,參數減少22%,推理速度提升2%,多任務支持全面升級! ?? 一、YOLOv11核心創新:輕量化與注意力機制的完美融合 YOLOv11并非顛覆性重構,而是通過模塊級優化實現“少參數、高精度、快推理”的目標…

基于 SpringBoot+Vue.js+ElementUI 的 “花開富貴“ 花園管理系統設計與實現7000字論文

摘要 本論文詳細闡述了基于 SpringBoot、Vue.js 和 ElementUI 的 "花開富貴" 花園管理系統的設計與實現過程。該系統旨在為花園管理者提供高效、便捷的花園信息管理平臺&#xff0c;實現花卉信息、員工、客戶、訂單等全方位管理功能。論文首先分析了花園管理系統的研…

RESTful API 安裝使用教程

一、RESTful API 簡介 REST&#xff08;Representational State Transfer&#xff09;是一種基于 Web 的架構風格&#xff0c;RESTful API 是使用 HTTP 協議并遵循 REST 原則設計的 API 接口。其核心思想是&#xff1a;使用標準 HTTP 方法&#xff08;GET、POST、PUT、DELETE&…

【行云流水ai筆記】粗粒度控制:推薦CTRL、GeDi 細粒度/多屬性控制:推薦TOLE、GPT-4RL

TOLE模型完整啟動方法指南 TOLE (Token-level Optimization with Language Models) 是一種基于強化學習的可控文本生成方法&#xff0c;通過token級別的反饋實現對文本多個屬性的精確控制。以下是完整的啟動方法指南&#xff1a; 1. 環境準備 1.1 創建虛擬環境 conda creat…

【沉浸式解決問題】idea開發中mapper類中突然找不到對應實體類

目錄 一、問題描述二、場景還原三、原因分析四、解決方案 一、問題描述 mapper類繼承了mybatis-plus的BaseMapper&#xff0c;泛型需要填入實體類&#xff0c;但是不知怎么地突然實體類就報錯了&#xff0c;顯示沒有這個類 二、場景還原 實體類就是死活報錯找不到&#xff0c;所…

初學python的我開始Leetcode題11-2

提示&#xff1a;100道LeetCode熱題-11-1主要是二分查找相關&#xff0c;包括三題&#xff1a;搜索旋轉排序數組、尋找旋轉排序數組中的最小值、尋找兩個正序數組的中位數。由于初學&#xff0c;所以我的代碼部分僅供參考。前言上次的三道二分查找題較為基礎&#xff0c;主要是…

Python 數據分析與可視化 Day 12 - 建模前準備與數據集拆分

? 今日目標 掌握建模前常見準備步驟學會使用 train_test_split() 將數據劃分為訓練集和測試集理解特征&#xff08;X&#xff09;與標簽&#xff08;y&#xff09;的區分學習常見建模流程的輸入要求&#xff08;格式、維度&#xff09;&#x1f4d8; 一、建模前準備流程概覽 數…

Swagger 安裝使用教程

一、Swagger 簡介 Swagger 是一套開放源代碼的 API 文檔生成工具鏈&#xff0c;現歸屬于 OpenAPI 規范。它支持 RESTful API 的定義、生成、測試和文檔自動化。常見的使用工具包括 Swagger UI、Swagger Editor、Swagger Codegen 以及 SpringFox&#xff08;Spring 集成庫&…

【seismic unix相速度分析-頻散曲線】

介紹Seismic Unix Seismic Unix&#xff08;SU&#xff09;是一個開源的地震數據處理軟件包&#xff0c;主要用于地震數據的處理、分析和可視化。它由科羅拉多礦業學院的Center for Wave Phenomena開發&#xff0c;廣泛應用于學術研究和工業領域。SU提供了一系列命令行工具&am…

3.前端和后端參數不一致,后端接不到數據的解決方案

目錄 1.問題背景: (1).前端代碼: (2).后端代碼: (3).問題分析: [1]前端參數構造錯誤: [2].Api請求配置錯誤: 2.解決方案 (1).修改 role.js 中的 API 方法 (2).前端組件中的調用方式改成下面的而不是繼續拼接了 3.總結: 1.問題背景: 我在接口開發過程中&#xff0c;前…

SpringBoot:整合quartz實現定時任務-MisFire的處理

文章目錄 一、什么是MisFire二、MisFire發生的情況三、MisFire的補償策略四、代碼實現 一、什么是MisFire 簡單理解為&#xff1a;定時任務&#xff0c;所錯過的觸發 二、MisFire發生的情況 1、資源緊張&#xff0c;定時任務請求不到對應的線程。 2、調度器關閉。 3、設置定…

返回json,優雅處理轉換(如 0.85 → “85.00%“)

核心解決方案 通過 自定義序列化器 JsonSerialize 注解&#xff0c;實現 BigDecimal 到百分比字符串的自動轉換。 1.1 自定義序列化器代碼 java import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterx…

大語言模型LLM在訓練/推理時的padding

討論的是在訓練大型語言模型&#xff08;Transformer-based models&#xff0c;比如GPT等&#xff09;時&#xff0c;文本序列的填充&#xff08;padding&#xff09;問題&#xff0c;即訓練和推理時分辨填充在序列的左側&#xff08;left padding&#xff09;或右側&#xff0…

50 個常用 Docker 命令

1. Docker 基礎命令 查看 Docker 版本 docker --version查看 Docker 運行狀態 systemctl status docker查看 Docker 信息 docker info查看幫助信息 docker help2. 鏡像管理 拉取鏡像 docker pull <鏡像名>查看本地鏡像 docker images刪除鏡像 docker rmi <鏡…