第3章 标准库类型习题
习题3.1 有适当的Using声明,而不用std::前缀,访问标准库中名字的方法,重新编写2.3节的程序,计算一给定数的给定次幂的结果。
代码如下:
//程序清单
#include<iostream>
using std::cin;
using std::cout;
using std::endl;
int main()
{
int base,exponent;
long result=1;
cout<<"Enter base and exponent:";
cin>>base>>exponent;
if(exponent<0)
{ cout<<"exponent can't small than 0"<<endl;return -1;}
if(exponent>0)
{
for(int cnt=1;cnt<=exponent;cnt++)
result*=base;}
cout<<base<<" raised to the power of " <<exponent<<":"<<result<<endl;
system("pause");
return 0;}
习题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 编写程序实现从标准输入每次读入一行文本。然后改写程序,每次读人一个单词。
代码如下:
//程序清单1
#include<iostream>
#include<string>
using namespace std;
int main()
{
string line;
while(getline(cin,line))
cout<<line<<endl;
return 0;
}
//程序清单2
#include<string>
using namespace std;
int main()
{
string word;
while(cin>>word)
cout<<word<<endl;
return 0;
}
习题3.6 解释string类型的输入操作符和getline函数分别如何处理空白字符。
答:string类型的输入操作符对空白字符的处理:读取并忽略开头所有的空白字符,直到再次遇到空白字符,读取终止。
getline函数对空白字符的处理:不忽略行开头的换行符,读取字符知道遇到换行符,读取终止并丢弃换行符。
习题3.7 编写一个程序读入两个string对象,测试它们是否相等。若不相等指出哪个大。接着改写程序测试它们的长度是否相等,若不相等指出哪个较长。
代码如下:
//程序清单
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s1,s2;
cout<<"Enter two string :"<<endl;
cin>>s1>>s2;
if(s1==s2)
cout<<"它们相等"<<endl;
else if(s1>s2)
cout<<"\""<<s1<<"\"is bigger than "
<<"\""<<s2<<"\""<<endl;
else cout<<"\""<<s2<<"\"is bigger than"
<<"\""<<s1<<"\""<<endl;
system("pause");
return 0;
}
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s1,s2;
cout<<"Enter two string :"<<endl;
cin>>s1>>s2;
string::size_type len1,len2;
len1=s1.size();
len2=s2.size();
if(len1==len2)
cout<<"They have sane length!"<<endl;
else if(len1>len2)
cout<<"The length of "<<"\""<<s1
<<"\"is logger than \""<<s2<<"\""<<endl;
else
cout<<cout<<"The length of "<<"\""<<s2
<<"\"is logger than \""<<s1<<"\""<<endl;
system("pause");
return 0;;
}
习题3.8 编一个程序,从标准输入读取多个string对象,把它们连接起来存放到一个更大的string对象中。并输出连接后的string对象。
代码如下:
//程序清单
#include<iostream>
#include<string>
using namespace std;
int main()
{
string result_str,str;
cout<<"Enter strings(ctrl+z to end):"<<endl;
cin>>result_str;
while(cin>>str)
result_str=result_str+str;
cout<<"连接后的string对象:"<<endl
<<result_str<<endl;
system("pause");
return 0;
}
习题3.9 下列程序实现什么功能?实现合法吗?如果不合法,说明理由。
string s;
cout<<s[0]<<endl;
答:不合法。s是一个空字符串,其长度为0,因此s[0]是无效的。
习题3.10 编一个程序,从string对象中去掉标点符号。要求输入到程序的字符串必须含有标点符号,输出结果则是去掉标点符号的string对象。
//程序清单
#include<iostream>
#include<string>
#include<cctype>
using namespace std;
int main()
{
string s,result_str;
bool has_punct=false;
char ch;
cout<<"Enter a string :"<<endl;
getline(cin,s);
for(string::size_type index=0;index!=s.size();++index)
{
ch=s[index];
if(ispunct(ch))
has_punct=true;
else result_str+=ch;
}
if(has_punct)
cout<<"Result:"<<endl<<result_str<<endl;
else{
cout<<"No punctuation character in the string?!"<<endl;
return -1;}
system("pause");
return 0;
}
习题3.13 读一组整数到vector对象,计算并输出每对相邻元素的和如果读入元素个数为奇数,则提示用户最后一个元素没有求和,并输出其值。然后修改程序:头尾元素两两配对,计算每对元素的和,并输出。
代码如下:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int>ivec;
intival;
//读数据到vector对象
cout<<"输入数据 (按ctrl+z结束):"<<endl;
while(cin>>ival)
ivec.push_back(ival);
//计算相邻元素并输出
if(ivec.size()==0)
{
cout<<"没有数据!"<<endl;
return-1;
}
cout<<"在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;
cout<<"最后一个元素没有求和!";
cout<<"它的值是: "<<ivec[ivec.size()-1]<<endl;
system("pause");
return0;
}
//第二问
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int>ivec;
intival;
cout<<"Enternumbers:"<<endl;
while(cin>>ival)
ivec.push_back(ival);
//计算首尾元素并输出
if(ivec.size()==0)
{
cout<<"没有数据! "<<endl;
return -1;
}
cout<<"计算vector对象中首尾元素之和 "<<endl;
vector<int>::size_typecnt=0;
vector<int>::size_typefirst,last;
for(vector<int>::size_typefirst=0,last=ivec.size()-1;
first<last;++first,--last)
{
cout<<ivec[first]+ivec[last]<<"\t";
++cnt;
if(cnt%6==0)
cout<<endl;
}
/*if(first==last)//提示居中元素没有求和
cout<<endl;
cout<<"居中元素没有求和";
cout<<"它的值是:"<<ivec[first]<<endl;
*/
system("pause");
return0;
}
习题3.14
读入一段文本到vector对象,每个单词储存为vector中的一个元素。把vector对象中每个单词转化为大写字母。输出vector对象中转化后的元素,每八个单词为一行输出。
#include<iostream>
#include<vector>
#include<string>
#include<cctype>
using namespace std;
int main()
{
vector<string> svec;
string str;
//读入文本到vector对象中
cout<<" Enter text(Enter ctrl+z to end):"<<endl;
while(cin>>str)
svec.push_back(str);
//将vector对象中小写字母转化为大写字母,并输出
if(svec.size()==0)
{
cout<< "No string !"<<endl;
return -1;
}
cout<< "Transformed element fromvector :"<<endl;
for(vector<string>::size_type ix=0;ix!=svec.size();++ix)
{
for( string::size_type index=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;
}
}
system("pause");
return 0;
}
习题 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中的元素。
代码如下:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int>ivec;
intival;
//读数据到vector对象
cout<<"输入数据 (按ctrl+z结束):"<<endl;
while(cin>>ival)
ivec.push_back(ival);
//计算相邻元素并输出
if(ivec.size()==0)
{
cout<<"没有数据!"<<endl;
return-1;
}
cout<<"在vector对象中相邻的每对元素之和:"<<endl;
vector<int>::size_type cnt=0;
for (vector<int>::iterator=ivec.begin();iter<ivec.end()-1;iter=iter+2)
{
cout<<*iter+*(iter+1)<< “\t”;
++cnt;
if( cnt%6==0)
cout<<endl;
}
if(ivec.size()%2!=0)//提示输出最后个元素没有求和
cout<<endl;
cout<<"最后一个元素没有求和!";
cout<<"它的值是: "<<*( ivec.end()-1)<<endl;
system("pause");
return0;
}
习题 3.18~3.19 编写程序来创建有10个元素的vector对象。用迭代器把每个元素值改为当前值的2倍,输出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;
cout<<*iter<<""<<endl;
}
system("pause");
return0;
}
习题 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迭代器。