C++标准库类型 bitset及其应用

---旧文整理---

  bitset 对象用每一个bit位存储0或1,可以用来标记存在或者不存在,位置下标和存储内容组成一个key-value对。用bit标记的好处就是可以节省内存空间,特别是应用于海量数据处理中。

  例如以下几个问题:(1) 已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数 ;(2) 2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数;(3) 某人有8角的邮票5张,1元的邮票4张,1元8角的邮票6张,用这些邮票中的一张或若干张可以得到多少种不同的邮资?

  以上3个问题的共同点都可以归结为:在一大堆数中找出不重复的个数——去重复问题。对于问题(3),在6*5*7个整数中去重复,我们可以用char数组或int数组存取,内存的节省不是那么明显;但对于(1)和(2),就很有必要采用bieset类库了。(1)中:8位最大为99 999 999,如果用每一个bit表示一个号码是否存在,假如每个号码平均出现1次,理论上只需要100M个bit(12.5MB)的内存。

 1 #include<iostream>
 2 #include<bitset>  // bitset类库声明
 3 using namespace std;
 4
 5 int main()
 6 {
 7     const unsigned int a = 189; // 最大邮资188角
 8     bitset<a> bitvec; // 生成bitset对象
 9
10     int x = 0, y = 0, z = 0;
11     for (x = 0; x <= 5; ++x){
12         for (y = 0; y <= 4; ++y){
13             for (z = 0; z <= 6; ++z){
14                 bitvec[8 * x + 10 * y + 18 * z] = 1;
15             }
16         }
17     }
18
19     int count = 0;
20     for (x = 0; x<a; ++x)
21     if (bitvec[x])
22         count++;
23     cout << "共有: " << count
24          << " 种邮资组合" << endl;
25
26     return 0;
27 }  

参考链接:

http://blog.csdn.net/yushuai007008/article/details/7466945

http://dongxicheng.org/structure/bitmap/

http://www.cplusplus.com/reference/bitset/bitset/

时间: 2024-10-11 09:51:23

C++标准库类型 bitset及其应用的相关文章

C++ Primer 学习笔记_9_标准库类型(续3) -- biteset

 标准库类型(四) --biteset 序言: 位是用来保存一组项或条件的yes/no信息[标识]的简洁方法. [cpp] view plaincopyprint? #include <bitset> using std::bitset; #include <bitset> using std::bitset; 正文: 1.bitset对象的定义和初始化 和vector对象不同的是:bitset类型对象的区别在于其长度而不是类型.在定义bitest时,要在尖括号中说明给出他的长

C++ Primer 第四版读书笔记(二)之标准库类型

C++定义了一个内容丰富的抽象数据类型标准库,其中最重要的标准库类型是string和vector,它们分别定义了大小可变的字符串和集合.string和vector往往将迭代器用作配套类型,用于访问string中的字符,或者vector中的元素. 另一种标准库类型为bitset,提供了一种抽象方法来操作位的集合. string类型支持长度可变的字符串,vector用于保存一组指定类型的对象. bitset类标准库类型提供了更方便和合理有效的语言级的抽象设施.通过这个类可以把某个值当作位的集合来处理

C++(3)标准库类型

标准库类型(一)--命名空间using与string类型 引: 标准库类型是语言组成部分中更基本的哪些数据类型(如:数组.指针)的抽象! C++标准库定义的是高级的抽象数据类型: 1.高级:因为其中反映了更复杂的概念: 2.抽象:因为我们在使用时不需要关心他们是如何表示的,我们只需要知道这些抽象数据类型支持哪些操作就可以了. 正文: 一.命名空间的using声明 1. using std::cin; ::运算符的作用含义是右操作数的名字可以在左操作数的作用域中找到. 格式: [cpp] view

【C++ Primer每日一刷之五】标准库类型小结

标准库类型小结 C++ 标准库定义了几种更高级的抽象数据类型,包括 string 和 vector 类型.string 类型提供了变长的字符串,而 vector 类型则可用于管理同一类型 的对象集合.迭代器实现了对存储于容器中对象的间接访问.迭代器可以用于访问和遍历 string 类型和vectors 类型的元素.下一节将介绍 C++ 的内置数据类型:数组和指针.这两种类型提供了类似于 vector 和 string 标准库类型的低级抽象类型.总的来说,相对于C++ 内置数据类型的数组和指针而言

3.2 标准库类型string(上)

#include <string> #include <iostream> using std::string; using std::cin; using std::cout; using std::endl; //string定义在命名空间std中 int main() { /**************3.2.1 定义和初始化string*****************/ string s1; //默认初始化,S1是一个空字符串 string S2 = s1; //S2时S

C++拾遗(二)——初窥标准库类型

本篇博文的开始,先介绍一道书上看到的智力题:有20瓶药丸,其中19瓶装有1克/粒的药丸,余下一瓶装有1.1克/粒的药丸.有一台称重精准的天平,只是用一次天平的情况下如何找出比较重的那瓶药丸? 好了,直接公布答案.从药瓶#1取出一粒药丸,从药瓶#2取出两粒,从药瓶#3取出三粒,依此类推.如果每粒药丸均重1克,则称得总重量为210克(1 + 2 + … + 20 = 20 * 21 / 2 = 210),“多出来的”重量必定来自每粒多0.1克的药丸.药瓶的编号可由算式(weight - 210 gr

标准库类型vector

标准库类型vector表示对象的集合,其中所有对象的类型都相同.集合中的每个对象都有一个与之对应的索引,索引用于访问对象.因为vector“容纳着”其他对象,所以它被称为容器. 要想使用vector,必须包含适当的头文件.#include<vector> C++语言既有类模板,也有函数模板 ,其中vector是一个类模板. 模板本身不是类或函数,相反可以将模板看作为编译器生成类或者函数编写的一份说明.编译器根据模板创建类或函数的过程成为实例化,当使用模板时,需要指出编译器应把类或函数实例化为何

C++ Primer 学习笔记_7_标准库类型(续1) -- vector类型

 标准库类型(二) --vector类型 引子: vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库将负责管理与存储元素相关的内存. 我们将vector称之为容器,一个容器中的所有对象都必须是同一类型的! [cpp] view plaincopyprint? #include <vector> using std::vector; #include <vector> using std::vector; [模板] vector

C++ Primer 学习笔记_8_标准库类型(续2) -- iterator

 标准库类型(三) --iterator 序言: 迭代器是一种检查容器内元素并遍历容器元素的数据类型. 所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作:因此,现代C++更倾向于使用迭代器而不是下标操作访问容器元素. 正文: 1.容器的iterator类型 每个标准库容器类型都定义了一个名为iterator的成员: [cpp] view plaincopyprint? vector<int>::iterator iter; vector<int>::ite