新闻中心

c++怎么实现一个简单的位图(Bitmap)_c++位图结构与应用示例

2025-11-01
浏览次数:
返回列表
位图用比特表示整数存在状态,节省内存。通过vector或bitset实现,支持set、clear、get操作,适用于去重排序小整数,如输出2 3 5 7 8;std::bitset适合固定大小场景,手动实现更灵活,广泛用于系统级设计。

c++怎么实现一个简单的位图(bitmap)_c++位图结构与应用示例

在C++中,位图(Bitmap)是一种高效的数据结构,用于表示一组布尔状态,通常用来标记某个整数是否出现过。它的核心思想是用一个比特(bit)来表示一个元素的存在与否,从而极大节省内存空间。

位图的基本原理

假设我们要处理的整数范围是 0 到 N-1,那么可以用 N 个比特来表示这些整数的状态:0 表示未出现,1 表示已出现。由于一个字节有8位,我们可以使用 unsigned charstd::vector 来存储这些比特。

更高效的做法是使用 std::vectorstd::bitset,通过位操作直接访问特定位置的比特。

手动实现简单的位图类

下面是一个基于 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 NameGPT

免费的名称生成器,AI驱动在线生成企业名称及Logo

NameGPT 119 查看详情 NameGPT

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版)在线直达 

搜索