第3章 标准库类型
【13】3.5编写程序实现从标准输入每次读入一行文本,然后修改程序,每次读入一个单词;
//从标准输入每次读入一行文本
#include<iostream>
#include<string>
usingnamespace std;
intmain()
{
stringline;
//一次读入一行,直到遇见文件结束符
while(getline(cin,line))
cout<<line<<wndl;
return0;
}
//从标准输入每次读入一个单词
stringword;
while(cin>>word)
cout<<word<<endl;
【14】3.6解释string类型的输入操作符和getline函数分别如何处理空白字符串
答:string类型的输入操作符对空白字符串的处理:读取并忽略有效字符(非空白字符)之前所有的空白字符,然后读取字符直至再次遇到空白字符,读取终止(该空白字符仍留在输入流中)。
getline函数对空白字符的处理:不忽略行开头的空白字符,读取字符直至遇到换行符,读取终止并丢弃换行符(换行符从输入流中去掉但并不存储在string对象中)。
【15】3.9下列程序实现什么功能?实现合法吗?
strings;
cout<<s[0]<<endl;
答:实现不合法。因为s是一个空字符串,其长度为0,因此s[0]是无效的。
【16】3.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;
}
【17】3.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”;
【18】3.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;
}
【19】3.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;
}
【20】3.15下面程序合法吗?如果不合法,如何更正?
vector<int>ivec;
ivec[0]=42;
答:不合法。因为ivec是空的vector对象,其中不含任何元素,而下标操作只能用于获取已存在的元素。
更正:将赋值语句改为ivec.push_back(42);
【21】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>::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();
}
【22】3.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;
}
【23】3.21何时使用const迭代器?又在何时使用const_iterator?解释两者的区别。
答:const迭代器是迭代器常量,该迭代器本身的值不能修改,即该迭代器在定义时需要初始化,而且初始化后,不能再指向其他元素。若需要指向固定元素的迭代器,则可以使用const迭代器。
const_iterator是一种迭代器类型,对这种类型的迭代器解引用会得到一个指向const对象的引用,即通过这种迭代器访问到的对象是常量。该对象不能修改,因此,const_iterator类型只能用于读取容器内的元素,不能修改元素的值。若只需遍历容器中的元素而无需修改它们,则可以使用const_iterator;
3.22如果采用下面的方法来计算mid会产生什么后果?
vector<int>::iteratormid=(vi.begin()+vi.end())/2;
将两个迭代器相加的操作是未定义的,因此用这种方法计算会出现编译错误。