C++习题整理(2)

来源:互联网 发布:北大网络教育好考吗 编辑:程序博客网 时间:2024/04/30 12:54
习题3.6 

解释string 类型的输入操作符和getline 函数分别如何处理空白字符。 

【解答】 

string 类型的输入操作符对空白字符的处理:读取并忽略有效字符(非空白字符)之前所有的空白字符,然后读取字符直至再次遇到空白字符,读取终止(该 空白字符仍留在输入流中)。 getline 函数对空白字符的处理:不忽略行开头的空白字符,读取字符直至遇到 换行符,读取终止并丢弃换行符(换行符从输入流中去掉但并不存储在string 对象中)。


习题3.9 
下列程序实现什么功能?实现合法吗?如果不合法,说明理由。 

string s; 
cout << s[0] << endl; 

【解答】 
该程序段输出string 对象s 所对应字符串的第一个字符。 实现不合法。因为s 是一个空字符串,其长度为0,因此s[0]是无效的。 
注意,在一些编译器(如Microsoft Visual C++ .NET 2003)的实现中,该 
程序段并不出现编译错误。


习题3.11 
下面哪些vector 定义不正确? (a) vector< vector<int> > ivec; (b) vector<string> svec = ivec  (c) vector<string> svec(10,"null"); 

【解答】 
(b)不正确。因为svec 定义为保存string 对象的vector 对象,而ivec 是 
保存vector <int>对象的vector 对象(即ivec 是vector 的vector),二者 
的元素类型不同,所以不能用ivec 来初始化svec。

习题3.12

下列每个vector 对象中元素个数是多少?各元素的值是什么? 
(a) vector<int> ivec1; 

(b) vector<int> ivec2(10);

 (c) vector<int> ivec3(10,42); 

(d) vector<string> svec1;

 (e) vector<string> svec2(10);

 (f) vector<string> svec3(10,"hello"); 

【解答】 
(a) 元素个数为0。 
(b) 元素个数为10,各元素的值均为0。 (c) 元素个数为10,各元素的值均为42。 (d) 元素个数为0。 
(e) 元素个数为10,各元素的值均为空字符串。 (f) 元素个数为10,各元素的值均为"hello"。 


习题3.15 
下面程序合法吗?如果不合法,如何更正? vector<int> ivec; ivec[0] = 42; 

【解答】 
不合法。因为ivec 是空的vector 对象,其中不含任何元素,而下标操作只 
能用于获取已存在的元素。 
更正:将赋值语句改为语句ivec.push_back(42);。


习题3.16 
列出三种定义vector 对象的方法,给定10 个元素,每个元素值为42。指出是 
否还有更好的实现方法,并说明为什么。 

【解答】 

方法一: 
vector<int> ivec(10, 42);

方法二: 
vector<int> ivec(10); for (ix = 0; ix < 10; ++ix) ivec[ix] = 42; 

方法三: 
vector<int> ivec(10); 
for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter) *iter = 42; 

方法四: 
vector<int> ivec; 
for (cnt = 1; cnt <= 10; ++cnt) ivec.push_back(42); 

方法五: 
vector<int> ivec; 
vector<int>::iterator iter = ivec.end(); for (int i = 0; i != 10; ++i) { ivec.insert(iter, 42); iter = ivec.end(); } 
各种方法都可达到目的,也许最后两种方法更好一些。它们使用标准库中定义 
的容器操作在容器中增添元素,无需在定义vector 对象时指定容器的大小,比 较灵活而且不容易出错。


习题3.21 
何时使用const 迭代器?又在何时使用const_iterator?解释两者的区别。

 【解答】 
const 迭代器是迭代器常量,该迭代器本身的值不能修改,即该迭代器在定义时 
需要初始化,而且初始化之后,不能再指向其他元素。若需要指向固定元素的 
迭代器,则可以使用const 迭代器。 
const_iterator 是一种迭代器类型,对这种类型的迭代器解引用会得到一个指 
向const 对象的引用,即通过这种迭代器访问到的对象是常量。该对象不能修 
改,因此,const_iterator 类型只能用于读取容器内的元素,不能修改元素的 
值。若只需遍历容器中的元素而无需修改它们,则可以使用const_iterator。


习题3.22 
如果采用下面的方法来计算mid 会产生什么结果?
vector<int>::iterator mid = (vi.begin() + vi.end())/2; 

【解答】 
将两个迭代器相加的操作是未定义的,因此用这种方法计算mid 会出现编译错 误。 


习题3.23 
解释下面每个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 位进行初始化。











































0 0
原创粉丝点击