std::bitset
是標準庫中的一個存儲 0/1
的大小不可變容器。嚴格來說,它並不屬於 STL——————————————源自於oi-wiki的介紹。ios
簡單來講bitset就是一種相似於數組的結構(只能存1 or 0)且能夠優化內存空間,一個元素只佔1bit 所以計算一些信息時,所需時間也是其1/32.c++
複雜度:通常記做O(n/32) 但這不太嚴謹 還有的記做O(n/w)其中w=32(計算機的位數),這種記法較爲廣泛接受。數組
食用方法:函數
1.先開個頭文件: 優化
#include <bitset>
2.指定大小:spa
bitset<1000> bz;// 下面的都是用這個bz來解釋。
3.定義與初始化code
bitset類型能夠用string和整數初始化(整數轉化成對應的二進制)blog
#include<iostream> #include<bitset> #include<cstring> using namespace std; int main() { bitset<23>bit (string("11101001")); cout<<bit<<endl; bit=233; cout<<bit<<endl; return 0; }
輸出
00000000000000011101001
00000000000000011101001
4.基本運算ip
bitset支持全部位運算內存
bitset<4>s1(string("1001")); bitset<4>s2(string("1000")); s1[1] = 1; cout<<s1[0]<<endl; //1 cout<<s1<<endl; //1011 cout<<(s1==s2)<<endl; //0 cout<<(s1!=s2)<<endl; //1 cout<<(s1^s2)<<endl; //0011 cout<<(s1&s2)<<endl; //1000 cout<<(s1|s2)<<endl; //1011 cout<<(~s1)<<endl; //0100 cout<<(s1>>1)<<endl; //0101
5.經常使用函數
count( ): 返回 true 的數量
size( ): 返回 bitset 的大小
any( ): 若存在某一位是 true 則返回 true ,不然返回 false
none( ): 若全部位都是 false 則返回 true ,不然返回 false
set( ): 將整個 bitset 設置成 true
set(pos,va1=true/false) 將某一位設置成 true/false 例如
bz.set(2,true)||bz.set(2,false)||bz.set(2)
reset( ):將整個 bitset 設置成 false
reset(pos): 將某一位設置成 false 至關於 set(pos ,false) 例如
bz.reset(2)//////////////////////補充前面的 bz.set()////////bz.reset()
flip( ): 翻轉每一位(至關於異或一個全是1的 bitset)
flip(pos): 翻轉某一位
_Find_ first( ): 返回 bitset 第一個 true
的下標,若沒有 true
則返回 bitset
的大小
_Find_next(pos): 返回 pos 後面(下標嚴格大於 pos 的位置)第一個 true 的下標,若 pos 後面沒有 true 則返回 bitset 的大小
把兩個相結合就能夠發生奇妙的反應
#include<bits/stdc++.h> int main() { std::bitset<1001> bz; bz.set(2); bz.set(4); bz.set(233); for(int i = bz._Find_first(); i != bz.size(); i = bz._Find_next(i)) std::cout << i << ' '; }
這樣就能夠遍歷一個 bitset了
最後
bitset
與樹分塊結合能夠解決一類求樹上多條路徑信息並的問題 而後還能夠與莫隊結合 等等........
完結撒花....(ohohohohohohoh)
仍是老話 :
做者不易,,,ε=(´ο`*)))唉,,,
轉載請附上連接Thanks♪(・ω・)ノ