C++ Primer 第3章 标准库类型习题+答案

 第3章 标准库类型习题

习题3.1 有适当的Using声明,而不用std::前缀,访问标准库中名字的方法,重新编写2.3节的程序,计算一给定数的给定次幂的结果。

代码如下:


 


 

 

习题3.2 什么是默认构造函数?

答:调用构造函数时不必给出实参的构造函数,称为默认构造函数(default constructor),当程序没有定义构造函数,系统会自动调用默认构造函数,一个系统提供的默认构造函数,它的函数体是空的,不起初始化作用。

 

习题3.3 列举出三种初始化String对象的方法。

答:1.String s1;-默认构造函数,s1为空串。

   2.String s2(s1);将s2初始化为s1的一个副本。

   3.string s3("valut"); 将s3初始化为一个字符串字面值副本。

 

习题3.4  s和s2的值分别是什么?

     string s;

     int mian(){

          string s2;

     }

答:s和s2的均为空字符串。

 

 

习题3.5 编写程序实现从标准输入每次读入一行文本。然后改写程序,每次读人一个单词。

代码如下:


 

 

 


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

答:string类型的输入操作符对空白字符的处理:读取并忽略开头所有的空白字符,直到再次遇到空白字符,读取终止。

getline函数对空白字符的处理:不忽略行开头的换行符,读取字符知道遇到换行符,读取终止并丢弃换行符。

 

习题3.7 编写一个程序读入两个string对象,测试它们是否相等。若不相等指出哪个大。接着改写程序测试它们的长度是否相等,若不相等指出哪个较长。

代码如下:


 

 

习题3.8 编一个程序,从标准输入读取多个string对象,把它们连接起来存放到一个更大的string对象中。并输出连接后的string对象。

代码如下:


 

 

 


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

string s;

cout<<s[0]<<endl;

答:不合法。s是一个空字符串,其长度为0,因此s[0]是无效的。

 

 

习题3.10 编一个程序,从string对象中去掉标点符号。要求输入到程序的字符串必须含有标点符号,输出结果则是去掉标点符号的string对象。

 



 

习题3.13  读一组整数到vector对象,计算并输出每对相邻元素的和如果读入元素个数为奇数,则提示用户最后一个元素没有求和,并输出其值。然后修改程序:头尾元素两两配对,计算每对元素的和,并输出。

代码如下:


 

 

 

习题3.14

读入一段文本到vector对象,每个单词储存为vector中的一个元素。把vector对象中每个单词转化为大写字母。输出vector对象中转化后的元素,每八个单词为一行输出。


 

 

 

习题 3.15 下面程序合法吗?如果不合法,如何更正?

vecter<int>  ivec;

ivec[0]=42;

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

 

 

 

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

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

方法2:vector<int> ivec(10);

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

        ivec[ix]=42;

方法3:vector<int>ivec(10);

for (vector<int>:: iteratoriter=iver.begin();iter!=ivec.end();++iter)

*iter=42;

方法4:vecctor<int> ivec;

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

ivec.push_back(42);

方法5:vector<int> ivec;

      vector<int>::iterator iter=ivec.end();

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

    {

        ivec.insert(iter,42);

        iter=ivec.end();

     }

 

 

习题 3.17  重做3.2节的习题 用迭代器来访问vector中的元素。

代码如下:


 

 

习题 3.18~3.19 编写程序来创建有10个元素的vector对象。用迭代器把每个元素值改为当前值的2倍,输出vector的所有元素。

代码如下:


 

 

习题 3.20 解释一下在上几个习题的程序实现中你用了哪种迭代器,并说明原因。

解:用了vector<int>::iterator和vector<string>::iterator的迭代器,通过这些迭代器的访问的元素类型,分别为int和string的vector对象元素。

 

 

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

解:const迭代器是迭代器常量,该迭代器的值本身不能修改,即该迭代器在定义时需要初始化,而且初始化之后,不能使它指向任何其他元素。若需要指定固定元素的迭代器,可以使用const迭代器。

 const_iterator是一种迭代器类型,对这种迭代器类型进行解引用,则可以得到一个指向const对象的引用。即通过这种迭代器访问到的对象是常量,该对象不能修改,因此,const_iterator迭代器只能读取容器内的元素,不能修改元素的值。若只需遍历容器中的元素无需修改它们,则可以使用const_iterator迭代器。

  

 

 


 

 

 

 

 

posted on 2011-09-25 16:43  1.曲待续  阅读(854)  评论(0编辑  收藏  举报

导航