新闻中心
c++怎么实现一个简单的位图(Bitmap)_c++位图结构与应用示例
位图用比特表示整数存在状态,节省内存。通过vector或bitset实现,支持set、clear、get操作,适用于去重排序小整数,如输出2 3 5 7 8;std::bitset适合固定大小场景,手动实现更灵活,广泛用于系统级设计。

在C++中,位图(Bitmap)是一种高效的数据结构,用于表示一组布尔状态,通常用来标记某个整数是否出现过。它的核心思想是用一个比特(bit)来表示一个元素的存在与否,从而极大节省内存空间。
位图的基本原理
假设我们要处理的整数范围是 0 到 N-1,那么可以用 N 个比特来表示这些整数的状态:0 表示未出现,1 表示已出现。由于一个字节有8位,我们可以使用 unsigned char 或 std::vector
更高效的做法是使用 std::vector
手动实现简单的位图类
下面是一个基于 vector
#include <iostream>
#include <vector>
class Bitmap {
private:
std::vector<char> bits;
int
size;
public:
// 构造函数,指定最大数值范围
Bitmap(int n) : size(n) {
bits.resize((n + 7) / 8, 0); // 每个 char 8 bit,向上取整
}
// 设置某一位为 1
void set(int i) {
if (i < 0 || i >= size) return;
int byteIndex = i / 8;
int bitIndex = i % 8;
bits[byteIndex] |= (1 << bitIndex);
}
// 清除某一位为 0
void clear(int i) {
if (i < 0 || i >= size) return;
int byteIndex = i / 8;
int bitIndex = i % 8;
bits[byteIndex] &= ~(1 << bitIndex);
}
// 检查某一位是否为 1
bool get(int i) {
if (i < 0 || i >= size) return false;
int byteIndex = i / 8;
int bitIndex = i % 8;
return (bits[byteIndex] & (1 << bitIndex)) != 0;
}
};
使用示例:去重与排序小整数
位图常用于对非负整数进行快速去重和排序。比如我们有一组数据,想输出不重复且有序的结果:
NameGPT
免费的名称生成器,AI驱动在线生成企业名称及Logo
119
查看详情
int main() {
Bitmap bm(100); // 支持 0~99
int nums[] = {5, 2, 7, 5, 3, 2, 8, 7};
int n = sizeof(nums) / sizeof(nums[0]);
// 插入所有数字(自动去重)
for (int i = 0; i < n; ++i) {
bm.set(nums[i]);
}
// 按顺序输出存在的数字
std::cout << "Unique sorted numbers: ";
for (int i = 0; i < 100; ++i) {
if (bm.get(i)) {
std::cout << i << " ";
}
}
std::cout << std::endl;
return 0;
}
输出结果:
Unique sorted numbers: 2 3 5 7 8
标准库替代方案:std::bitset
如果大小在编译期已知,可以直接使用 std::bitset,它更安全且接口简洁:
#include <bitset>
#include <iostream>
int main() {
std::bitset<100> bs; // 固定大小为100
bs.set(5);
bs.set(2);
bs.set(7);
bs.set(5); // 重复设置无影响
for (int i = 0; i < 100; ++i) {
if (bs.test(i)) {
std::cout << i << " ";
}
}
std::cout << std::endl;
return 0;
}
基本上就这些。自己实现的 Bitmap 更灵活,可动态扩展;而 std::bitset 更适合固定场景,写起来更简单。实际应用中,位图广泛用于布隆过滤器、内存页管理、文件系统索引等底层系统设计中。注意它只适用于整数且范围不太大的情况,超出后要考虑 Roaring Bitmap 等优化结构。
以上就是c++++怎么实现一个简单的位图(Bitmap)_c++位图结构与应用示例的详细内容,更多请关注其它相关文章!
# 是一个
# 人才网站全年推广方案
# 海口怎么优化关键词排名
# 正规网站优化大概费用
# 灌阳关键词排名加盟
# 响应式网站建设营销推广
# 铜仁港网站建设
# 深圳独立网站优化有用吗
# 乳山seo关键词排名优化软件
# 江宁区企业网站推广服务
# seo专职好做吗
# 是一种
# 更灵活
# 字节
# 正确处理
# 如何用
# 如何处理
# 重写
# 适用于
# 有什么
# 数据结构
# 标准库
# stream
# ios
# c++
# ai
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染
Typer应用中灵活处理命令行参数的令牌化与解析
搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具
如何有效阻止外部脚本意外修改内联样式的高度属性
LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理
绝地鸭卫平a核爆刀流玩法攻略
C++如何生成随机数_C++ random库使用方法与范围设置
妖精漫画网页版登录入口免费_妖精漫画官网主页直接阅读漫画
j*a toString()的覆盖
可靠CSGO开箱平台解析 CSGO开箱网合集
圆通快递查询实时追踪 圆通物流包裹状态快速查看
163邮箱官方主页登录 直达网易邮箱登录核心页面
age动漫网站入口 age动漫官网直接访问入口
FullCalendar 自定义按钮样式定制指南
Angular Material 垂直步进器:实现底部到顶部排序的教程
海量存储:机器视觉智能化的核心基石
Pandas DataFrame 高效批量赋值:告别循环与笛卡尔积误区
在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全
探索高级语言到原生C/C++的转译:挑战与内存管理策略
如何在J*a中使用Locale处理多语言环境
Odoo 16:在表单视图中基于当前记录动态修改Tree视图属性
知音漫客正版漫画平台_知音漫客官网账号登录
C++ explicit关键字防止隐式转换_C++构造函数安全规范
Win11怎么开启省电模式_Win11电池节电模式自动开启
黑鲨3Pro怎样在相册开漫画风滤镜_iPhone黑鲨3Pro相册开漫画风滤镜【趣味滤镜】
cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法
Tailwind CSS line-clamp 布局问题解析与修复指南
理解Python模块与全局变量的作用域管理
C++指针和引用有什么区别_C++内存管理核心概念深度解析
c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换
wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法
J*aScript教程:根据元素文本内容动态设置背景色
b站如何看历史记录_b站观看历史找回方法
如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式
大象笔记网页版入口 印象笔记网页版登录入口
谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问
邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧
J*aScript异步迭代器_j*ascript异步遍历
Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】
零跑汽车11月交付量达70327台 实现连续9个月正增长
CSS布局中意外空白:解决padding-top导致的顶部间距问题
php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】
J*aScript中赋值与自增运算符的复杂交互与执行机制
c++中的std::basic_string的SSO优化_c++短字符串优化深度解析
192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台
2025AO3夸克浏览器通道_AO3手机HTTPS安全入口分享
NetBeans Ant项目:自动化将资源文件复制到dist目录的教程
必由学官网快捷入口 必由学网页版在线学习平台
Go语言中对Map值调用带指针接收者方法:原理与最佳实践
拷贝漫画电脑版官网入口 拷贝漫画(PC版)在线直达


2025-11-01
浏览次数:次
返回列表
size;
public:
// 构造函数,指定最大数值范围
Bitmap(int n) : size(n) {
bits.resize((n + 7) / 8, 0); // 每个 char 8 bit,向上取整
}
// 设置某一位为 1
void set(int i) {
if (i < 0 || i >= size) return;
int byteIndex = i / 8;
int bitIndex = i % 8;
bits[byteIndex] |= (1 << bitIndex);
}
// 清除某一位为 0
void clear(int i) {
if (i < 0 || i >= size) return;
int byteIndex = i / 8;
int bitIndex = i % 8;
bits[byteIndex] &= ~(1 << bitIndex);
}
// 检查某一位是否为 1
bool get(int i) {
if (i < 0 || i >= size) return false;
int byteIndex = i / 8;
int bitIndex = i % 8;
return (bits[byteIndex] & (1 << bitIndex)) != 0;
}
};