习题3.13 读一组整数到vector对象,计算并输出每对相邻元素的和.如果读入元素个数为奇数,则提示用户最后一个元素没有求和,并输出其值.然后修改程序:头尾元素两两配对(每一个和最后一个,第二个和倒数第二个,以此类推),计算每对元素的和,并输出.
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> ivec;
int ival;
//读入数据到vector对象
cout<<"Enter numbers(Ctrl+Z to end):"<<endl;
while(cin>>ival)
ivec.push_back(ival);
//计算相邻元素的和并输出
if(ivec.size()==0){
cout<<"No element?!"<<endl;
return -1;
}
cout<<"Sum of each pair of adjacent elements in the vector:"
<<endl;
for(vector<int>::size_type ix=0;ix<ivec.size()-1;ix=ix+2){
cout<<ivec[ix]+ivec[ix+1]<<"/t";
if((ix+1%6==0)//每行输出6个和
cout<<endl;
}
if(ivec.size()%2!=0) //提示最后一个元素没有求和
cout<<endl
<<"The last element is not been summed"
<<"and its value is "
<<ivec[ivec.size()-1]<<endl;
return 0;
}
程序先是定义了一个vector对象ivec以及一个整型ival.终止输入数字的快捷键是Ctrl+Z,不断输入数字,利用vector操作函数v.push_back(t)来实现元素连接,就是不断在vector对象ivec后面添加,测试ivec的长度,如果没有输入,则为0,输出警告提示.有输入的话,通过循环的下标操作,实现第一个跟第二个相加,第三个跟第四个相加,用ivec的长度减1来测试ix大小./t则是水平制表符.然后用if条件来判断,每行输出六个数据,也就是相加之后的值.如果ivec的元素不是偶数,则会提示ivec最后那个元素.
改写的程序:
//读一组整数到vector对象,计算首尾配对元素的和并输出
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> ivec;
int ival;
//读入数据到vector对象
cout<<"Enter numbers(Ctrl+Z to end):"<<endl;
while(cin>>ival)
ivec.push_back(ival);
//计算首尾配对元素的和并输出
if(ivec.size()==0){
cout<<"No element?!"<<endl;
return -1;
}
cout<<"Sum of each pair of counterpart elements in the vector:"
<<endl;
vector<int>::size_type cnt=0;
for(vector<int>::size_type first=0;last=ivec.size()-1;first<last;++first,--last){
cout<<ivec[first]+ivec[last]<<"/t";
++cnt;
if((ix+1%6==0)//每行输出6个和
cout<<endl;
}
if(first==last) //提示居中元素没有求和
cout<<endl
<<"The center element is not been summed"
<<"and its value is "
<<ivec[first]<<endl;
return 0;
}
困,明天继续 - -
习题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(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 elements from the vector:"
<<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]))
//单词中下标为index的字符为小写字符
svec[ix][index]=toupper(svec[ix][index]);
cout<<svec[ix]<<" ";
if((ix+1)%8==0) //每八个单词为一行输出
cout<<endl;
}
return 0;
}
看的不甚明白,大概两个循环就是现循环每个单词的每个字符,然后循环每个单词.
通过判断,调用小写改大写的函数,然后输出.
习题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=1;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对象时制定容器的大小,比较灵活而且不容易出错