动态位集通过std::vector存储比特位,支持运行时指定大小和动态扩容。核心设计包括位索引到字索引的映射、按位操作及resize/push_back等动态行为,兼顾内存紧凑与访问效率。

在C++中,std::bitset 是一个非常高效的固定大小位容器,适用于编译时已知长度的场景。但当需要动态调整位数时(例如处理不确定长度的二进制数据、实现布隆过滤器或稀疏位图),std::bitset 就无法满足需求了。这时就需要一个动态位数组——即“动态 bitset”。
动态位集的核心目标是:像 std::vector
我们可以自己实现一个简易但高效的动态位集类,关键点包括:
#include <vector>
#include <cstddef>
#include <stdexcept>
<p>class dynamic_bitset {
private:
std::vector<unsigned long> data;
size_t num_bits;</p><pre class='brush:php;toolbar:false;'>static constexpr size_t bits_per_word
= sizeof(unsigned long) * 8;
size_t word_index(size_t pos) const { return pos / bits_per_word; }
size_t bit_offset(size_t pos) const { return pos % bits_per_word; }
unsigned long bit_mask(size_t pos) const { return 1UL << bit_offset(pos); }public: explicit dynamic_bitset(size_t n = 0) : num_bits(n) { data.resize((n + bits_per_word - 1) / bits_per_word, 0); }
void resize(size_t new_size) {
size_t old_words = (num_bits + bits_per_word - 1) / bits_per_word;
num_bits = new_size;
size_t new_words = (new_size + bits_per_word - 1) / bits_per_word;
data.resize(new_words, 0);
// 可选:如果缩小,清除多余位
if (new_size < num_bits) {
size_t last_bit = bit_offset(new_size);
if (last_bit != 0) {
data[new_words - 1] &= (1UL << last_bit) - 1;
}
}
}
bool operator[](size_t pos) const {
return (data[word_index(pos)] & bit_mask(pos)) != 0;
}
void set(size_t pos, bool value = true) {
if (value)
data[word_index(pos)] |= bit_mask(pos);
else
data[word_index(pos)] &= ~bit_mask(pos);
}
void reset() {
std::fill(data.begin(), data.end(), 0);
}
void push_back(bool value) {
if (bit_offset(num_bits) == 0) { // 需要新 word
data.push_back(0);
}
set(num_bits++, value);
}
size_t size() const { return num_bits; }
bool empty() const { return num_bits == 0; }};
动态位集的优势在于极致的空间利用率,每个布尔值仅占 1 bit,远优于 vector
小云雀
剪映出品的AI视频和图片创作助手
1949
查看详情
如果你不想从头实现,可以考虑以下成熟方案:
自定义实现适合对性能和内存有极致要求的场景,比如嵌入式系统或高频算法竞赛。
基本上就这些。掌握动态位集的设计,不仅能节省内存,还能提升位操作密集型任务的效率。关键是理解位索引到字索引的映射逻辑,以及如何安全地进行位运算。不复杂但容易忽略细节。
以上就是C++怎么实现一个位集(bitset)的动态版本_C++动态位数组与空间优化的详细内容,更多请关注其它相关文章!
# 还能
# 高端楼盘如何营销推广
# 英文seo写手网站
# 德阳抖音营销推广招聘
# 辽宁电子网站优化口碑好
# 师德师风建设专题网站
# 网站建设优化服务特色
# seo是怎么获客的
# 海口推广网站大全
# seo和sem发展之路
# 游戏行业网站seo案例
# 已有
# c++位集
# 如果你
# 堪比
# 单元测试
# 如何实现
# 整型
# 数据结构
# 嵌入式系统
# 如何使用
# c++
# word
# 动态位集
相关文章:
为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法
如何将HTML表格多行数据保存到Google Sheets
解决PHP集成HTML后CSS和图片路径加载问题的指南
Composer如何在生产环境安全地执行composer update
yandex入口引擎手机版 yandex安卓版下载入口
Lar*el开发:如何在编辑界面正确预选数据库中的多选标签
一加手机电池耗电快怎么办_一加手机电池耗电快的解决方法
快手极速版在线观看 官方网页版登录地址
C#如何安全地从用户上传的XML文件中读取数据? 验证与清理策略
必由学官网首页入口 必由学教师网页版登录指南
iwriter统一登录平台 iwrite账号密码登录页面
b站如何看历史记录_b站观看历史找回方法
Selenium Python中处理点击后新窗口加载冻结问题的策略与实践
在命令行怎么运行html项目_命令行运行html项目方法【教程】
C#使用XPath查询节点时出错? 常见语法错误与调试技巧
印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】
从OpenAI API响应中高效提取生成文本
在哪找SublimeJ远程工具_SFTP插件配置教程
在Socket.IO连接中实现Access Token自动更新与动态重连
天眼查企业查询官网入口 天眼查官方网页版查询
Composer的 "conflict" 字段有什么用_如何声明不兼容的包以避免依赖冲突
Win11怎么关闭触摸屏_Windows 11禁用HID符合标准触摸屏
HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制
QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问
必由学网页版入口 必由学官方平台直接访问
零跑汽车11月交付量达70327台 实现连续9个月正增长
J*a递归快速排序中静态变量导致数据累积问题的解决方案
《噬血代码2》新预告片发布 展示游戏剧情
Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法
163邮箱登录密码 163邮箱忘记密码找回
怎样把文件彻底粉碎无法恢复_Windows下安全删除敏感数据【隐私保护】
VS Code远程开发时如何处理文件权限问题
蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址
火狐浏览器占用内存高卡顿怎么办 火狐浏览器性能优化设置技巧
c++ 命名空间怎么用 c++ namespace使用指南
在J*a中如何开发简易仓库管理与库存统计_仓库管理库存统计项目实战解析
163邮箱注册官网 免费申请163个人邮箱
单12V-2×6实现为RTX 5090供电750W!甚至都没敢跑分
CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略
微信客户端如何收红包_微信客户端接收红包使用教程
不会效仿卡普空!《铁拳》制作人澄清:不采取赛事付费|直播|
解决Django多数据库/多Schema环境下外键迁移问题
使用PHP DOM解析器高效提取HTML中特定标题及其紧邻段落
如何使用 Excel 发布器与 Power BI 分享 Excel 洞察
在Go Martini框架中高效服务动态生成图像的实践指南
c++如何使用Meson构建系统_c++比CMake更快的构建工具
4399网页游戏电脑版全新入口 4399电脑端在线玩指南
钉钉视频会议声音异常如何处理 钉钉会议音频修复技巧
包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址
Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问
*请认真填写需求信息,我们会在24小时内与您取得联系。