1. 程式人生 > >C++學習筆記(三)(標準庫vector型別和bitset型別)

C++學習筆記(三)(標準庫vector型別和bitset型別)

1. vector物件的定義和初始化

標頭檔案 < vector>
幾種初始化vector物件的方式:

vector<T> v1;     //vector儲存型別為T的物件,預設建構函式v1為空
vector<T> v2(v1);  //v2是v1的一個副本
vector<T> v3(n,i);  //v3包含n個值為i的元素
vector<T> v4(n);  //v4含有值初始化的元素的n個副本

如果沒有指定元素的初始化式,
若vector儲存內建型別(如int型別)的元素,那麼標準庫將用0值建立元素初始化式;
若vector儲存的是含有建構函式的類型別(如string)的元素,標準庫將用該型別的預設建構函式建立元素(對應string型別的為空字串)初始化式。

2. 不能通過vector的下標操作新增新元素,新增新元素應當使用push_back()函式;

必須是已存在的元素才能使用下標操作進行索引,如果通過下標增加元素,將會因為對不存在的元素進行了索引而導致“緩衝區溢位”。
利用下標修改已存在的元素還是可行的。

3. 迭代器

for(vector<int>::iterator iter = v.begin(); iter != v.endl(); iter++)

上述為一個vector迭代器遍歷vector容器的例子,

1. 如果容器中有元素,則由begin返回的迭代器指向第一個元素;
2. 由end操作返回的迭代器指向vector的末端元素的下一個,即end操作返回的迭代器並不指向vector中的任何實際元素,他只是起一個哨兵(sentinel)的作用,表示我們已經處理完vector中所有的元素,通常稱之為“超出末端迭代器”(off-the-end iterator)。
3. 如果vector為空,則begin返回的迭代器與end返回的迭代器相同。

4. 迭代器的自增與解引用運算

  1. 迭代器使用自增操作符“++”向前移動迭代器指向容器中的下一個元素;
  2. 迭代器型別可使用解引用操作符“*”來訪問迭代器所指向的元素,如*iter。

*5. const_iterator和const迭代器(用的少)

每種容器型別都還有一種const_iterator型別的迭代器,這種型別的迭代器只能用於讀取容器內元素,但不能改變該元素值。
例:

for(vector<int>::const_iterztor iter = v.begin(); iter != v.end(); iter++){
    cout<<*iter<<endl;//正確
*iter="*"; //錯誤 }

const_iterator與const的iterator物件不同。
宣告一個const迭代器(非const_iterator),必須初始化迭代器,並且之後不能修改它的值:

const vector<int>::iterator iter = v.begin();        //即迭代器iter為const型別
*iter = 1;  //正確,可以修改其指向的與元素的值
iter++;    //錯誤,不能改變該迭代器的值

6. 標準庫bitset型別

標頭檔案 < bitset >
bitset是一種標準庫型別,用於儲存位集,並提供對各個位的測試和置位操作。
bitset物件的定義和初始化:

bitset<n> b;      //b有n位,每位都為0
bitset<n> b(u);   //b是unsigned long型u的一個副本
bitset<n> b(s);   //b是string物件s中含有的位串的副本
bitset<n> b(s, pos, n);  //b是s中從pos位置開始的n個位的副本,如果n省略意味著從pos位置取到末尾
  1. 用unsigned值初始化bitset物件
    如果bitset型別長度大於unsigned long(4個位元組,32位)值的二進位制位數,則其餘的高階位置為0;
    如果bitset型別長度小於unsigned long值的二進位制位數,則只使用unsigned值中的低階位,超過bitset型別長度的高階位將被丟棄。
    例,在32位unsigned long的機器上,有如下程式碼:
bitset<16> bitvec1(0xffff);   //bitvec1小於32位,高階位被丟棄,0~15位為1
bitset<32> bitvec2(0xffff); //bitvec2等於32位,0~15位為1,16~31位為0
bitset<128> bitvec3(0xffff);//bitvec3大於32位,0~15位為1,16~31位為0,32~127位補0
  1. 用string物件初始化bitset物件
    當用string物件初始化bitset物件時,string物件直接表示為為模式。從string物件讀入位集的順序是從右向左
    例:
string strval("1100");
bitset<32> bitvec4(strval);

strval讀入位集的順序是“0-0-1-1”,因此bitvec4的第0,1位為0; 第2,3位為1,其餘位補0。

7. bitset物件上的操作

操作 作用
b.any() b中是否存在置為1的二進位制位,存在返回1,否則返回0
b.none() b中是否不存在置為1的二進位制位,不存在返回1,否則返回0
b.count() b中置為1的二進位制位的個數
b.size() b中二進位制位的個數(長度)
b[pos] 訪問b在pos處的二進位制位
b.test(pos) b在pos處的二進位制位是否為1,為1返回1,否則返回0
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流

PS:試了一下將包含字母或超過1的數字的字串讀入到bitset中,會出現錯誤。