自学内容网 自学内容网

c++中 bitset set multiset 的用法

bitset

简介

bitset 是 c++ 标准库中的一个存储 0/1 的大小不可变的容器。严格来讲,它并不属于 STL。
内存变量为 bool 类型。

#include<bitset> // 头文件

bitset<1000> bs; // 定义一个大小为 1000 长度的 bitset 容器,其中 每一位都为false (即为 1 )

基本操作

bitset <N > bs(num); // 将整数num 转化成 二进制数,储存到 bs 中,不够的用 0 补齐
bitset <N > bs(string); // 将字符串string(0,1 字符串)转化成 二进制数,储存到 bs 中,不够的用 0 补齐
bs.count(); // 返回 1 的数量
bs.count(); // 返回 bitset 容器的大小
bs.test(pos); // 判断 倒数 第 pos 位 是否为 1 
bs.any(); // 若 bs 中存在 1 ,则返回 1 ,否则返回 0
bs.none(); // 若 bs 中存在 0 ,则返回 1 ,否则返回 0
bs.all(); // 若 bs 中所有位置都是 1 ,则返回 1 ,否则返回 0
bs.set(); // 将整个 bs 所有位置 设置成 1
bs.set(pos,(1,0)); // 将某一位置设置为 1 或 0
bs.reset(); // 将整个 bs 所有位置 设置成 0
bs.reset(pos); // 将某一位置设置为 0
bs.flip(); // 将整个 bs 所有位置 翻转(1 变成 0 , 0 变成 1)
bs.flip(pos); //翻转 某一位
bs.to_ulong(); //返回转化的十进制数(unsigned long 值)
bs.to_ullong(); //返回转化的十进制数(unsigned long long 值,c++11 起)
bs._Find_first(); //返回第一个为 1 的下标,若没有返回 bs 的长度
bs._Find_next(pos); // 返回 pos位 后的第一个为 1 的下标,若没有返回 bs 的长度

运算符

bitset<N>b1;
bitset<N>b2;
if(b1==b2/b1!=b2) // 判断 两个容器是否相同或者不相同

bitset 支持位操作符 &|^~,以及相应的复合赋值操作符 &=|=^=。

支持位移操作符
b2=b1 << 1; // 左移
b2=b1 >> 1; // 右移

set

简介

set 是关联容器,含有键值类型对象的已排序集,搜索、移除和插入拥有对数复杂度。set 内部通常采用 红黑树 实现。平衡二叉树 的特性使得 set 非常适合处理需要同时兼顾查找、插入与删除的情况。

和数学中的集合相似,set 中不会出现值相同的元素。如果需要有相同元素的集合,需要使用 multiset。multiset 的使用方法与 set 的使用方法基本相同。

基本操作

s.insert(x); // 当容器中没有等价元素的时候,将元素 x 插入到 set 中
s.erase(x); //删除值为 x 的所有元素,返回删除元素的个数
s.erase(pos); //删除迭代器为pos的元素,要求迭代器必须合法
s.erase(first,last); //删除迭代器在[first,last)范围内的所有元素
s.clear(); // 清空set
s.count(x); // 返回值为 x 的元素数量
s.find(x); //返回值为x 的元素的迭代器,否则返回end()
s.lower_bound(x); // 返回指向首个不小于 x 的元素的迭代器。如果不存在这样的元素,返回 end()
s.upper_bound(x); // 返回指向首个大于 x 的元素的迭代器。如果不存在这样的元素,返回 end()
s.empty(); // 判断set 容器是否为空,如果为空返回 1,否则返回 0
s.size(); // 返回容器的元素个数

multiset

简介

c++语言中,multiset是库中一个非常有用的类型,它可以看成一个序列,插入一个数,删除一个数都能够在O(logn)的时间内完成,而且他能时刻保证序列中的数是有序的,而且序列中可以存在重复的数。

基本操作

ms.begin(); // 返回set 容器的第一个元素的迭代器
ms.end(); // 返回set 容器的最后一个元素的迭代器
ms.rbegin(); // 返回逆序迭代器,指向容器元素最后一个位置
ms.rend(); // 返回逆序迭代器,指向容器第一个元素前面位置
ms.clear(); // 清空set 容器里的所有元素
ms.empty(); // 判断set 容器是否为空,是返回 1,否则返回 0
ms.insert(x); // 插入一个元素(o( nlog(n) ))
ms.insert(pos,x); // 指定位置插入元素
ms.insert(a.begin(),a.end()); // 将a容器区间的所有元素,插入到ms 容器中
ms.erase(x); //删除值为 x 的所有元素,返回删除元素的个数
ms.erase(pos); //删除迭代器为pos的元素,要求迭代器必须合法
ms.erase(first,last); //删除迭代器在[first,last)范围内的所有元素
ms.empty(); // 构造元素
ms.size(); // 返回set 容器的元素个数
ms.count(x); // 返回容器中元素为x 的个数
ms.find(x); // 返回元素为x 的第一个元素的迭代器,否则返回end()
ms.lower_bound(x); // 返回指向首个不小于 x 的元素的迭代器。如果不存在这样的元素,返回 end()
ms.upper_bound(x); // 返回指向首个大于 x 的元素的迭代器。如果不存在这样的元素,返回 end()
ms.equal_range(x); // 返回x 可安插的第一个位置和最后一个位置(等于元素等于x 的个数)

自定义操作

struct op{
    int x,y;
};
struct cmp{
    bool operator()(const op&a,const op&b){
        return a.x<b.x||a.x==b.x&&a.y<b.y;
    }
};
multiset<op,cmp>ms;

原文地址:https://blog.csdn.net/2302_80423900/article/details/140584366

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!