点击蓝字
关注我们
来源于网络,侵删unordered_set / unordered_multiset
这两个容器的方法与上一篇 C++ STL简介(3) 提到的 set / multiset 基本一样。但是要注意的是:这两个是无序的,基于哈希表实现的,增删改查的时间复杂度均为 O(1)。因为是无序的,所以不支持 lower_bound() 和 upper_bound() 以及迭代器的 ++、- -操作。unordered_set 中不允许有重复的元素,unordered_multiset 中允许有重复元素。
unordered_map / unordered_multimap
同 unordered_set / unordered_multiset,这两个容器的方法与上一篇 C++ STL简介(3) 提到的 map / multimap 也基本一样。但是要注意的是:这两个也是无序的,基于哈希表实现的,增删改查的时间复杂度均为 O(1)。因为是无序的,所以不支持 lower_bound() 和 upper_bound() 以及迭代器的 ++、- -操作。unordered_map 中不允许有重复的元素,unordered_multimap 中允许有重复元素。
bitset
简介
bitset 模板类由若干个位(bit)组成,它提供一些成员函数,使程序员不必通过位运算就能很方便地访问、修改其中的任意一位。bitset 模板类在头文件 #include<bitset> 中。
bitset 可看作一个 多位二进制数,每 8 位占用 1 个字节,相当于采用了状态压缩的二进制数组,并支持基本的位运算。在估算程序运行的时间时,我们一般以 32 位整数的运算次数为基准,因此 n 位 bitset 执行一次位运算的复杂度可视为 n / 32,效率较高。
声明
bitset 的声明方式为:bitset<32> bit;
注意:<>
中为 位数 。初始条件下声明的容器中全部为 0。
#include<iostream>
#include<bitset>
#include<string>using namespace std;int main() {bitset<32> bit;cout << bit;// 输出结果:00000000000000000000000000000000 (32个0) return 0;
}
声明并初始化
在声明的同时也可以进行初始化,可以使用 十进制、十六进制 的数进行初始化,也可以使用 字符串 进行初始化。
#include<iostream>
#include<bitset>
#include<string>using namespace std;int main() {// 1.使用十进制进行初始化 bitset<8> bit(32);cout << bit << endl;// 输出十进制 32 的二进制:00100000// 2.使用十六进制进行初始化 32 的十六进制为 0x20 bitset<8> bit1(0x20);cout << bit1 << endl;// 输出十六进制 32 的二进制:00100000// 3.使用字符串进行初始化string str = "00100000";bitset<8> bit2(str);cout << bit2 << endl;// 输出 00100000return 0;
}
operator[]
可以像使用数组一样来对 bitset 进行操作。可以使用 []
进行访问,也可以进行赋值或者修改。
#include<iostream>
#include<bitset>
#include<string>using namespace std;int main() {// 1.使用十进制进行初始化 bitset<8> bit(32);cout << bit << endl;// 输出十进制 32 的二进制:00100000// 输出第 6 位cout << bit[5] << endl; // 下标从 0 开始,最右边为第 1 位,下标为 0。// 输出结果:1 // 将第 6 位修改为 0bit[5] = 0;cout << bit; // 输出结果:00000000 return 0;
}
operator&=,|=,^=,~
进行二进制与、或、异或及非。bitset 支持位运算。
#include<iostream>
#include<bitset>
#include<string>using namespace std;int main() {bitset<16> dest;string pattern_str = "1001";bitset<16> pattern(pattern_str);for (size_t i = 0, ie = dest.size()/pattern_str.size(); i != ie; ++i) {dest <<= pattern_str.size();dest |= pattern;}cout << dest << '\n';// 输出结果:1001100110011001return 0;
}
operator<<,>>
bitset 可以进行二进制的左移、右移运算。
#include<iostream>
#include<bitset>
#include<string>using namespace std;int main() {bitset<8> bit("01111111");cout << bit << endl;// 输出结果:01111111// 将 bit 左移一位并用 b 接收 auto b = (bit << 1);cout << b << endl;// 输出结果:11111110 return 0;
}
operator==,!=
比较两个 bitset 是否相等。若每一位都相等则返回 true
,否则返回 false
。
all()
若全部位被设为 true
则为 true
,否则为 false
。即判断 bitset 中是否全部为 1
。
any()
若任何一位被设为 true
则为 true
,否则为 false
。即判断 bitset 中是否至少有一个 1
。
none()
若无位被设为 true
则为 true
,否则为 false
。即判断 bitset 中是否全为 0
。
count()
返回设为 true
的位数。即返回 bitset 中 1
的个数。
set()
set() 方法有两个重载方法。
设置所有位为
true
。
#include<iostream>
#include<bitset>
#include<string>using namespace std;int main() {bitset<8> bit;cout << bit << endl;// 输出结果:00000000// 将所有位设置为 1 bit.set(); cout << bit;// 输出结果:11111111return 0;
}
set(pos, value) 设置在
pos
的位为值value
。
#include<iostream>
#include<bitset>
#include<string>using namespace std;int main() {bitset<8> bit;cout << bit << endl;// 输出结果:00000000// 将第一位设置为 1 bit.set(0, 1); cout << bit;// 输出结果:00000001return 0;
}
reset()
将所有位置设置为 false
。
#include<iostream>
#include<bitset>
#include<string>using namespace std;int main() {bitset<8> bit("11111111");cout << bit << endl;// 输出结果:11111111// 将所有位置设置为 0 bit.reset(); cout << bit;// 输出结果:00000000return 0;
}
flip()
进行 取反
操作,等价于位运算的 ~。
flip() 将所有位置取反
#include<iostream>
#include<bitset>
#include<string>using namespace std;int main() {bitset<8> bit("10101010");cout << bit << endl;// 输出结果:10101010// 将所有位置取反 bit.flip(); cout << bit;// 输出结果:01010101return 0;
}
flip(pos) 将位于 pos 位置的数据进行取反。
如果你年满18周岁以上,又觉得学【C语言】太难?想尝试其他编程语言,那么我推荐你学Python,现有价值499元Python零基础课程限时免费领取,限10个名额!
▲扫描二维码-免费领取
戳“阅读原文”我们一起进步