幾種初始化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...