vector操作的习题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cool_mirror/article/details/1712908

习题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对象时制定容器的大小,比较灵活而且不容易出错

 

展开阅读全文

没有更多推荐了,返回首页