首页 > 其他分享 >位图--类似于数组,用于整数的集合

位图--类似于数组,用于整数的集合

时间:2024-08-02 21:29:01浏览次数:13  
标签:std studentId -- STUDENTS int 数组 cpp 位图

位图(Bitmap)是一种数据结构,它使用位(bit)来表示信息,通常用来表示一组元素的集合。在位图中,每个位对应集合中的一个元素,如果位的值为1,则表示该元素存在或被选中;如果位的值为0,则表示该元素不存在或未被选中。位图因其高效的内存使用和快速的查找、插入、删除操作而广泛应用于各种场景。

位图的特点:
- **内存效率**:位图使用单个位来表示元素的存在或不存在,因此对于大型数据集,位图可以非常节省内存。
- **快速操作**:位图支持快速的查找、插入和删除操作,因为这些操作可以简化为位操作。

位图算法示例:

假设我们有一个班级,有30个学生,我们想用位图来跟踪哪些学生出席了课程。我们可以用一个30位的位图来表示,每位对应一个学生,1表示出席,0表示缺席。初始化位图:

```cpp
#include <vector>
#include <iostream>

const int STUDENTS = 30; // 学生数量
std::vector<bool> attendanceMap(STUDENTS, 0); // 初始化位图,所有学生默认为缺席
```

标记学生出席:

```cpp
void markAttendance(int studentId) {
    if (studentId >= 0 && studentId < STUDENTS) {
        attendanceMap[studentId] = true; // 将对应位置为1
    }
}
```

检查学生是否出席:

```cpp
bool checkAttendance(int studentId) {
    if (studentId >= 0 && studentId < STUDENTS) {
        return attendanceMap[studentId]; // 返回该位的值
    }
    return false;
}
```

打印出席情况:

```cpp
void printAttendance() {
    for (int i = 0; i < STUDENTS; ++i) {
        std::cout << (attendanceMap[i] ? "Present " : "Absent ");
    }
    std::cout << std::endl;
}
```

主函数示例:

```cpp
int main() {
    markAttendance(5); // 学生5出席
    markAttendance(15); // 学生15出席
    printAttendance(); // 打印所有学生的出席情况

    std::cout << "Student 5 is " << (checkAttendance(5) ? "Present" : "Absent") << std::endl;
    std::cout << "Student 10 is " << (checkAttendance(10) ? "Present" : "Absent") << std::endl;

    return 0;
}
```

位图的应用场景:
1. **内存映射**:操作系统使用位图来跟踪内存页的使用情况。
2. **图形和图像处理**:位图用于表示图像的像素,每个像素用一个或多个位来表示颜色。
3. **数据压缩**:位图可以用于表示数据的压缩信息,如霍夫曼编码树的节点存在性。
4. **集合操作**:位图可以用于实现集合的并集、交集和差集等操作。

位图是一种简单但强大的数据结构,通过使用位操作,它提供了一种高效的方式来处理大量数据。在C++中,可以使用`std::vector<bool>`或`std::bitset`来实现位图,或者使用裸机位数组来获得更底层的控制。
 

标签:std,studentId,--,STUDENTS,int,数组,cpp,位图
From: https://blog.csdn.net/Kegi_/article/details/140880507

相关文章

  • 接口文档,jwt,base64编码解码
    Ⅰ接口文档【一】接口文档了解#作为后端,接口写完了--->接口给前端使用 -登录接口:username,password,code#写接口的人负责写接口文档 -如何写?-写在哪?#通常在公司中: 1使用world编写,放在公共平台上2使用MD编写3第三方平台编写:showdoc -http......
  • 【C语言】程序环境,预处理,编译,汇编,链接详细介绍,其中预处理阶段重点讲解
    目录程序环境翻译环境1.翻译环境的两个过程2.编译过程的三个阶段 执行环境 预处理(预编译) 1.预定义符号2.#define 2.1用#define定义标识符(符号)2.2用#define定义宏 2.3#define的替换规则 2.4#和##的用法2.5宏和函数2.6#undef3.命令......
  • 一文搞定:Syncthing多平台文件同步工具安装全攻略
    简介Syncthing是一款开源的文件同步工具,可以通过本地网络或互联网实现多台设备之间的文件同步。与其他同步工具不同,Syncthing强调隐私和安全,确保用户的数据始终处于用户的控制之下。功能与特点开源软件:Syncthing是完全开源的,源代码托管在GitHub上,任何人都可以查看、审查和......
  • mysql数据库查询时用到的分页方法有哪些
     在处理数据库查询时,我们经常需要对结果进行分页,以便在用户界面上提供更好的浏览体验。MySQL提供了几种不同的方法来实现这一功能,其中最常见的是使用LIMIT子句。以下是三种使用LIMIT进行分页的基本方法。一、使用LIMIT子句LIMIT子句用于指定查询结果的最大记录数。它的基本语......
  • MATLAB车牌识别,详细图文代码过程
    基于Matlab的车牌识别   摘要:车牌识别技术是智能交通系统的重要组成部分,在近年来得到了很大的发展。本文从预处理、边缘检测、车牌定位、字符分割、字符识别五个方面,具体介绍了车牌自动识别的原理。并用MATLAB软件编程来实现每一个部分,最后识别出汽车车牌。    ......
  • leetcode 2181.合并零之间的结点
    1.题目要求:/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/structListNode*mergeNodes(structListNode*head){structListNode*cur=head;intcount=0;//1.遍历结......
  • leetcode 2181.合并零之间的结点
    1.题目要求:/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/structListNode*mergeNodes(structListNode*head){structListNode*cur=head;intcount=0;//1.遍历结......
  • 【攻防技术系列+SQL注入】mysql靶场
    墨者靶场(SQL手工注入漏洞测试(MySQL数据库))工具dirsearchsqlmappythondirsearch.py-uhttp://<IP>:<端口>/在登录界面,没有账户和密码,也进不去,就在没啥收获的时候,直觉告诉我要打开F12开发者模式,这次信它,就在东点点西点点的时候,我发现了什么。如果遇到扫描漏网之鱼......
  • 6.C基础_输入输出函数
    putchar功能:输出一个字符函数声明:intputchar(intc);返回值:参数c的ASCLL码值c:要输出的字符,可以为字符常量、字符变量或表达式注意点:输出的结果不带'\n'getchar功能:从键盘读一字符函数声明:intgetchar(void);返回值:获取数据的ASCLL码值,当输入ctrl+d时会退出获取,此......
  • Python数据结构第二天—循环链表、树、二叉搜索树
    双向链表之前学习的单向链表只能从头遍历到尾,过程是单向的,而双向链表既可以从头遍历到尾,也可以从尾遍历到头,它的过程是双向的。既然它是双向的,那么我们要实现一个双向链表,就需要在单向链表的基础上,给每一个结点增加一个向前的引用。双向链表的创建:"""我们要实现的是一......