值得一看
广告
彩虹云商城
广告

热门广告位

c++怎么实现一个位图数据结构_c++位图数据结构实现方法

位图使用位操作高效存储布尔值,每个位表示一个整数的存在性,适合去重、查找等场景。通过std::vector<unsigned char>可实现动态位图,支持set、reset、test操作,内存占用小且访问速度快。

c++怎么实现一个位图数据结构_c++位图数据结构实现方法

在C++中实现一个位图(Bitmap)数据结构,主要是利用位操作来高效地存储和操作布尔值集合。每个位代表一个状态(0或1),适合用于去重、排序、快速查找等场景,比如处理大量整数的是否存在判断。

基本原理与设计思路

位图的核心思想是用一个 bit 来表示一个整数的存在与否。例如,要表示 0 到 N-1 的整数是否存在,可以使用 (N + 7) / 8 字节的内存空间(即向上取整到字节边界)。

关键点:

  • 使用 unsigned char 数组或 std::vector<bool>std::bitset 实现底层存储
  • 通过位运算设置、清除、查询某一位
  • 支持动态大小时可用 std::vector<unsigned char>

手动实现简易位图类

下面是一个基于 std::vector<unsigned char> 的可变长位图实现:

立即学习“C++免费学习笔记(深入)”;

即构数智人

即构数智人

即构数智人是由即构科技推出的AI虚拟数字人视频创作平台,支持数字人形象定制、短视频创作、数字人直播等。

即构数智人36

查看详情
即构数智人

#include <iostream>
#include <vector>
#include <cassert>
class Bitmap {
private:
std::vector<unsigned char> data;
size_t num_bits;
// 获取字节索引
size_t byte_index(size_t bit) const {
return bit / 8;
}
// 获取位在字节中的偏移
size_t bit_offset(size_t bit) const {
return bit % 8;
}
public:
explicit Bitmap(size_t n) : num_bits(n) {
data.resize((n + 7) / 8, 0);  // 每个字节8位,向上取整
}
// 设置某一位为1
void set(size_t bit) {
assert(bit < num_bits);
size_t byte_idx = byte_index(bit);
size_t offset = bit_offset(bit);
data[byte_idx] |= (1 << offset);
}
// 清除某一位为0
void reset(size_t bit) {
assert(bit < num_bits);
size_t byte_idx = byte_index(bit);
size_t offset = bit_offset(bit);
data[byte_idx] &= ~(1 << offset);
}
// 查询某一位是否为1
bool test(size_t bit) const {
assert(bit < num_bits);
size_t byte_idx = byte_index(bit);
size_t offset = bit_offset(bit);
return (data[byte_idx] >> offset) & 1;
}
// 清空所有位
void clear() {
std::fill(data.begin(), data.end(), 0);
}
};

使用示例

测试上面的位图实现:

int main() {
Bitmap bm(100);  // 支持0~99
bm.set(10);
bm.set(20);
bm.set(99);
std::cout << "bit 10: " << bm.test(10) << "\n";  // 输出 1
std::cout << "bit 15: " << bm.test(15) << "\n";  // 输出 0
std::cout << "bit 99: " << bm.test(99) << "\n";  // 输出 1
bm.reset(99);
std::cout << "bit 99 after reset: " << bm.test(99) << "\n";  // 输出 0
return 0;
}

标准库替代方案

C++ 提供了一些更高级的选择:

  • std::bitset<N>:编译期固定大小,性能高,接口简洁
  • std::vector<bool>:动态大小,但注意它是特化模板,行为不同于普通vector

例如使用 std::bitset

#include <bitset>
#include <iostream>
std::bitset<100> bs;
bs.set(10);
bs.set(20);
std::cout << bs.test(10);  // 输出 true

基本上就这些。自己实现可以灵活控制内存和扩展功能,而标准库版本更安全便捷。根据需求选择即可。位图特别适合处理密集整数集合,节省空间且速度快。

相关标签:

字节 ai c++ ios stream 内存占用 标准库 bool char 数据结构 接口
温馨提示: 本文最后更新于2025-10-01 22:28:46,某些文章具有时效性,若有错误或已失效,请在下方留言或联系在线客服
文章版权声明 1 本网站名称: 创客网
2 本站永久网址:https://new.ie310.com
1 本文采用非商业性使用-相同方式共享 4.0 国际许可协议[CC BY-NC-SA]进行授权
2 本站所有内容仅供参考,分享出来是为了可以给大家提供新的思路。
3 互联网转载资源会有一些其他联系方式,请大家不要盲目相信,被骗本站概不负责!
4 本网站只做项目揭秘,无法一对一教学指导,每篇文章内都含项目全套的教程讲解,请仔细阅读。
5 本站分享的所有平台仅供展示,本站不对平台真实性负责,站长建议大家自己根据项目关键词自己选择平台。
6 因为文章发布时间和您阅读文章时间存在时间差,所以有些项目红利期可能已经过了,能不能赚钱需要自己判断。
7 本网站仅做资源分享,不做任何收益保障,创业公司上收费几百上千的项目我免费分享出来的,希望大家可以认真学习。
8 本站所有资料均来自互联网公开分享,并不代表本站立场,如不慎侵犯到您的版权利益,请联系79283999@qq.com删除。

本站资料仅供学习交流使用请勿商业运营,严禁从事违法,侵权等任何非法活动,否则后果自负!
THE END
喜欢就支持一下吧
点赞5赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容