1. 標准庫bitset
#include<bitset>
using std::bitset; //或者using namespace std;
1-1: bitset類是一種類模板;而與vector不一樣的是bitset類型對象的區別僅僅在其長度而不在其類型。定義時,知名長度值:bitset<32> bitvec;
位集合的位置從0開始,bitvec的為序是從0到31.以0位開始的位串是低階為,以31位結束的位串是高階位。
1-2:幾種初始化方法:
bitset<n>b; //b有n位,每位都為0
bitset<n>b(u); //b是unsigned long型u的一個副本
bitset<n>b(s); //b是string對象s中含有的位串的副本
bitset<32>bitvec(“1100”); //第2、3位為1,其余為0
注意:string對象和bitset對象之間是反向轉化的:string對象的最右邊字符(即下標最大的那個字符)用來初始化bitset對象的低階位(即下標為0的位)。
bitset<n> b(s,pos,n); //b是s中從位置pos開始的n個位的副本,當省略第三個參數n時,則一直取到字符串末尾
bitset<16>bitvec(0xffff); //十六進制表示16個1
bitset<32>bitvec(0xffff); //十六進制表示低位16個1,高位16個0
1-3: bitset常用操作
b.any(); //b中是否存在置為1的二進制位
b.none(); //b中不存在置為1的二進制位嗎?
b.count(); //b中置為1的二進制的個數
b.size(); //b中二進制位的個數 返回值類型是size_t
b[pos]; //訪問b中在pos處的二進制位
b.test(pos); //b中在pos處的二進制位是否為1?
b.set(); //把b中所有二進制位都置為1
b.set(pos); //把b中在pos處的二進制位置為1
b.reset(); //把b中所有二進制都置為0
b.reset(pos); //把b中在pos處的二進制位置為0
b.flip(); //把b中所有二進制位逐位取反
b.flip(pos); //把b中在pos處的二進制位取反
b.to_ulong(); //用b中同樣的二進制位返回一個unsigned long值
os<< b //把b中的位集輸出到os流
2. 數組
與vector類型相似,數組也可以保存某種類型的一組對象;但數組長度是固定的。已經創建,就不允許添加新的元素。
比較:現代的C++程序更多的使用vector取代數組,數組被嚴格限制於程序內部使用,只有當性能測試表明使用vector無法達到必要的速度要求時,才使用數組。
數組定義中的類型名可以是內置數組類型或類類型,除引用之外,數組元素的類型還合一是任意的復合類型。沒有所有元素都是引用的數組。
2-1: 數組初始化:維數必須在一對方括號[ ]內指定
顯示初始化數組元素:
const unsigned size= 3;
int ia[size] = {0,1,2}; //數組含有3個元素分別是0,1,2
int ia[] = {0,1,2}; //根據列出元素個數確定數組長度為3
如果元素為類類型,自動調用默認構造函數進行初始化;如果該類沒有默認構造函數,則必須為該數組的元素提供顯示初始化
特殊的字符數組:
char ca1[] = {‘C’, ’+’,’+’}; //長度為3的字符數組
char ca2[] = {‘C’, ’+’,’+’, ‘\0’}; //長度為4的字符數組,末尾為空字符
char ca3[] = “C++”; 長度為4的字符數組,末尾為空字符
不允許數組直接復制和賦值:
不能用一個數組賦值方式初始化一個新數組
int ia[] = {0,1,2};
int ia2[](ia); //錯誤!!!
2-2: 數組操作
使用下標操作符訪問,下標從0開始,到n-1(數組有n個元素).
作者:TskyFree