第三章 標準庫型別

2021-06-04 13:00:39 字數 4212 閱讀 8621

幾種初始化string類的方法:

string型別的輸入操作符:

int main(void)

return 0;

}

int main(void)

return 0;

}

bitset<32> bitvec;

給出的長度必須是常量表示式,而且是整型。

bitsetb(u);//b是unsigned long型u的乙個副本

bitsetb(s);//b是string物件s中含有位串的副本

bitsetb(s, pos, n);//b是s中從位置pos開始的n個位的副本

bitset<16> bitvec1(0xffff);

bitset<32> bitvec2(0xffff);

bitset<128> bitvec3(0xffff);

以上三個例子中,0到15位都置為1。由於bitvec1的位數少於unsigned long的位數,因此bitvec1的初始值的高階位被丟掉。bitvec2和unsigned long長度相等,因此所有位正好了初始值。bitvec3長度大於32,31位以上的高階位都被值為0。

string str("1100");

bitset<32> bitvec4(str);

string str("1111111000000011001101");

bitset<32> bitvec5(str, 5, 4);

bitset<32> bitvec6(str, str.size()-4);

什麼是預設建構函式?

【解答】

預設建構函式(default constructor)就是在沒有顯式提供初始化式時呼叫的建構函式。它由不帶引數的建構函式,或者為所有形參提供預設實參的建構函式定義。如果定義某個類的變數時沒有提供初始化式,就會使用預設建構函式。如果使用者定義的類中沒有顯式定義任何建構函式,編譯器就會自動為該類生成預設建構函式,稱為合成的預設建構函式(synthesized default constructor)

解釋string 型別的輸入操作符和getline 函式分別如何處理空白字元。

【解答】

string 型別的輸入操作符對空白字元的處理:讀取並忽略有效字元(非空白字元)之前所有的空白字元,然後讀取字元直至再次遇到空白字元,讀取終止(該空白字元仍留在輸入流中)。

getline 函式對空白字元的處理:不忽略行開頭的空白字元,讀取字元直至遇到換行符,讀取終止並丟棄換行符(換行符從輸入流中去掉但並不儲存在string物件中)。

編乙個程式,從string 物件中去掉標點符號。要求輸入到程式的字串必須含有標點符號,輸出結果則是去掉標點符號後的string 物件。

#include #include #include using namespace std;

int main()

if(ivec.size() == 0)

int i;

iter iter;

for(iter = ivec.begin(), i = 1; iter != ivec.end()-1 && iter != ivec.end(); iter += 2, i += 2)

if(ivec.size()%2 == 0)

else

system("pause");

return 0;

}

列出三種定義vector 物件的方法,給定10 個元素,每個元素值為42。指出是

否還有更好的實現方法,並說明為什麼。

【解答】

方法一:

vectorivec(10, 42);
方法二:
vectorivec(10);

for (ix = 0; ix < 10; ++ix)

ivec[ix] = 42;

方法三:

vectorivec(10);

for (vector::iterator iter = ivec.begin();

iter != ivec.end(); ++iter)

*iter = 42;

方法四:

vectorivec;

for (cnt = 1; cnt <= 10; ++cnt)

ivec.push_back(42);

方法五:

vectorivec;

vector::iterator iter = ivec.end();

for (int i = 0; i != 10; ++i)

各種方法都可達到目的,也許最後兩種方法更好一些。它們使用標準庫中定義的容器操作在容器中增添元素,無需在定義vector 物件時指定容器的大小,比較靈活而且不容易出錯。

何時使用const 迭代器?又在何時使用const_iterator?解釋兩者的區別。

【解答】

const 迭代器是迭代器常量,該迭代器本身的值不能修改,即該迭代器在定義時需要初始化,而且初始化之後,不能再指向其他元素。若需要指向固定元素的迭代器,則可以使用const 迭代器。const_iterator 是一種迭代器型別,對這種型別的迭代器解引用會得到乙個指向const 物件的引用,即通過這種迭代器訪問到的物件是常量。該物件不能修改,因此,const_iterator 型別只能用於讀取容器內的元素,不能修改元素的值。若只需遍歷容器中的元素而無需修改它們,則可以使用const_iterator。

如果採用下面的方法來計算mid 會產生什麼結果?

vector::iterator mid = (vi.begin() + vi.end())/2;

【解答】

將兩個迭代器相加的操作是未定義的,因此用這種方法計算mid 會出現編譯錯誤。

解釋下面每個bitset 物件包含的位模式:

(a) bitset<64> bitvec(32);

(b) bitset<32> bv(1010101);

(c) string bstr; cin >> bstr; bitset<8> bv(bstr);

【解答】

(a) bitvec 有64 個二進位制位,(位編號從0 開始)第5 位置為1,其餘位置均為0。

(b) bv 有32 個二進位制位,(位編號從0 開始)第0、2、4、5、7、8、11、13、14、16、17、18、19 位置為1,其餘位置均為0。因為十進位制數1010101 對應的二進位制數為000000000000011110110100110110101。

(c) bv 有8 個二進位制位,(位編號從0 開始)用讀入的字串的從右至左的8個字元對bv 的0~7 位進行初始化。

考慮這樣的序列1,2,3,5,8,13,21,並初始化乙個將該序列數字所對應的位置設定為1 的bitset<32>物件。然後換個方法,給定乙個空的bitset 物件,編寫一小段程式把相應的數字設定為1。

【解答】

方法一:

bitset<32>物件的初始化:

bitset<32> bv(0x20212e)
方法二:

bitset<32> bv;

int x = 0, y = 1, z;

z = x + y;

while (z <= 21)

注意,設定為1 的數字的位編號符合斐波那契數列的規律。

第三章 標準庫型別

3.1 命名空間的using宣告 通常,在標頭檔案中只定義卻是需要的東西,如只用到std cout,就應該只定義這個,不要把所有的都給定義出來。3.2 標準庫string型別 1 string物件的定義和初始化 為了與c相容,字串字面值與標準庫string型別不是同一種型別,程式設計時一定要注意區分...

第三章標準庫型別

1.命名空間using宣告 using std string 就能使用string,必須引入標頭檔案 更便捷的使用方法 using namespace std 2.標準庫string 型別 物件定義和初始化 string s1 空串 string s2 s1 將s2初始化為s1的乙個副本 strin...

2010 7 20第三章標準庫型別

今天看完了這一章,主要講了string類,vector容器,迭代器,和bitset類的特點,操作和一些值得注意的地方,string和vector相對於c語言來說更傾向整體的操作,用慣了char型別和陣列和指標對於類的操作一下顯得有點不適應。下面總結這幾個類得一些要注意的地方。一.string型別 1...