C++ STL详解(4)

点击蓝字

30f1d18215ce3ba680b2ffda9dcfcf53.png

关注我们

来源于网络,侵删

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;
  // 输出 00100000
  return 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 位修改为 0
  bit[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';
    // 输出结果:1001100110011001
  return 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;
  // 输出结果:11111111


  return 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;
  // 输出结果:00000001


  return 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;
  // 输出结果:00000000


  return 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;
  // 输出结果:01010101


  return 0;
}
  • flip(pos) 将位于 pos 位置的数据进行取反。

740221c4634aae6887024bb28a6965c3.gif

如果你年满18周岁以上,又觉得学【C语言】太难?想尝试其他编程语言,那么我推荐你学Python,现有价值499元Python零基础课程限时免费领取,限10个名额!
▲扫描二维码-免费领取

b1559f210918be9eceed18ca8adb1cd0.gif

戳“阅读原文”我们一起进步