《C++ Primer 4 Answer Book》 整理[3]——第3章 标准库类型

3      标准库类型

         133.5编写程序实现从标准输入每次读入一行文本,然后修改程序,每次读入一个单词;

         //从标准输入每次读入一行文本

         #include<iostream>

         #include<string>

         usingnamespace std;

         intmain()

         {

                   stringline;

                   //一次读入一行,直到遇见文件结束符

                   while(getline(cin,line))

                            cout<<line<<wndl;

                   return0;

         }

        

//从标准输入每次读入一个单词

stringword

         while(cin>>word)

                   cout<<word<<endl;

 

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

答:string类型的输入操作符对空白字符串的处理:读取并忽略有效字符(非空白字符)之前所有的空白字符,然后读取字符直至再次遇到空白字符,读取终止(该空白字符仍留在输入流中)。

getline函数对空白字符的处理:不忽略行开头的空白字符,读取字符直至遇到换行符,读取终止并丢弃换行符(换行符从输入流中去掉但并不存储在string对象中)。

 

         153.9下列程序实现什么功能?实现合法吗?

                   strings;

                   cout<<s[0]<<endl;

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

 

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

         答:#include <iostream>

                   #include<string>

                   #include<cctype>

                   usingnamespace std;

                  

                   intmain()

                   {

                            strings,result_str;

                            boolhas_punct=false;

charch;

                            cout<<”Entera string:”<<endl;

                            getline(cin,s);

                           

                            for(string::size_typeindex =0 ;index !=s.size();++index)

                            {

                                     ch=s[index];

                                     if(ispunct(ch))

                                               has_punct=true;

                                     else

                                               result_str+=ch;

                            }

                            if(has_punct)

                                     cout<<”Return:”<<endl<<result_str<<endl;

                            else{

                                     cout<<”Nopunctuation character in the string!”<<endl;

                                     return1;

                            }

                            return0;

                   }

        

         173.12下列每个vector对象中元素个数是多少?各元素的值是什么?

                   a)vector<int> ivec1; 元素个数为0

                   b)vector<int> ivec2(10); 元素个数为10,每个元素值均为0

                   c)vector<int> ivec3(10,42); 元素个数为10,每个元素个数均为42

                   d)vector<string> svec1; 元素个数为0

                   e)vector<string> svec2(10); 元素个数为10,各元素的值均为空字符串;

                  f)vector<string> svec3(10,”hello”); 元素个数为10,各元素的值均为”hello”;

        

         183.13读一组整数到vector对象,并计算输出每对相邻元素的和。如果读入元素个数为奇数,则提示用户最后一个元素没有求和,并输出其值。

         答:#include <iostream>

                   #include<vector>

                   usingnamespace std;

                   intmain()

                   {

                            vector<int>ivec;

                            intival;

                            cout<<”Enternumbers(Ctrl+z to end):”<<endl;

                            while(cin>>ival){ivec.push_back(ival);}

                            if(ivec.size()==0){

                                     cout<<”Noelement!”<<endl;

                                     return-1;

}

cout<<”Sumof each pair of adjacent elements in the vector:”<<endl;

for(vector<int>::size_typeix=0;ix<ivec.size()-1;ix=ix+2)

{

         cout<<ivec[ix]+ivec[ix+1]<<”\t”;

         if((ix+1)%6==0)cout<<endl;

}

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

         cout<<endl

                   <<”Thelast element is not been summed”

                   <<”andits value is”

                   <<ivec[ivec.size()-1]<<endl;

return0;

                   }

 

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

         #include<iostream>

         #include<string>

         #include<vector>

         #include<cctype>

         usingnamespace std;

         intmain()

         {

                   vector<string>svec;

                   stringstr;

                   cout<<”Entertext(Ctrl+z to end):”<<endl;

                   while(cin>>str)

                            svec.push_back(str);

                   if(svec.size()==0)

                   {

                            cout<<”Nostring!”<<endl;

                            return-1;

                   }

                   cout<<”Transformedelements from the vector:”<<endl;

                   for(vector<string>::size_typeix=0;ix!=svec.size();++ix)

                   {

                            for(string::size_typeindex=0;index!=svec[ix].size();++index)

                            {

                                     if(islower(svec[ix][index]))

                                               svec[ix][index]=toupper(svec[ix][index]);

                            }

                            cout<<svec[ix]<<””;

                            if((ix+1)%8=0)   cout<<endl;

                   }

                   return0;

         }

 

203.15下面程序合法吗?如果不合法,如何更正?

         vector<int>ivec;

         ivec[0]=42;

答:不合法。因为ivec是空的vector对象,其中不含任何元素,而下标操作只能用于获取已存在的元素。

         更正:将赋值语句改为ivec.push_back(42);

 

213.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>::iteratoriter=ivec.begin();iter!=ivec.end();++iter)

                            *iter=42;

         方法四:vector<int> ivec;

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

                            ivec.push_back(42);

         方法五:vector<int> ivec;

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

                            for(inti=0;i!=10;++i){

                                     ivec.insert(iter,42);

                                     iter=ivec.end();

                            }

 

 

223.18编写程序来创建有10个元素的vector对象。用迭代器把每个元素值改为当前值的两倍;

#include <iostream>

#include<vector>

using namespace std;

int main()

{

         vector<int>ivec(10,20);

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

                   *iter=(*iter)*2;

         return 0;

}

 

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

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

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

 

         3.22如果采用下面的方法来计算mid会产生什么后果?

         vector<int>::iteratormid=(vi.begin()+vi.end())/2;

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值