点击蓝字

关注我们
来源于网络,侵删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个名额!▲扫描二维码-免费领取
戳“阅读原文”我们一起进步