数组操作

先说一点:数组的长度是固定的.

跟vector类型不同,数组不提供push_back或者其他的操作在数组中添加新元素,数组一经定义,就不允许再添加新元素.

如果必须在数组中添加新元素,程序员就必须自己管理内存:要求系统重新分配一个新的内存空间用于存放更大的数组,然后把原数组的所有元素复制到新分配的内存空间中.

4.1.2   数组操作

与vector元素一样,数组元素可用下标操作符来访问,数组元素也是从0开始计数.对于一个包含10个元素的数组,正确的下标值是从0到9,而不是从1到10.

在用下标访问元素时,vector使用vector::size_type作为下标的类型,而数组下标的正确类型则是size_t.

在下面的例子中,for循环遍历数组的10个元素,并以其下标值作为各个元素的初始值:

int main()
{
 const size_t array_size=10;
 int ia[array_size];  //10 ints,elements are unintialized
 //loop through array,assigning value of its index to each element
 for(size_t ix=0; ix!=array_size;++ix)
  ia[ix]=ix;
 return 0;
}

使用类似的循环,可以实现把一个数组复制给另一个数组:

int main()
{
 const size_t array_size=7;
 int ia1[]={0,1,2,3,4,5,6};
 int ia2[array_size];  //local array,elements unintialized
 //copy elements from ia1 into ia2
 for(size_t ix=0;ix!=array_size;++ix)
  ia2[ix]=ia1[ix];
 return 0;
}

检查数组下标值:

正如string和vector类型,程序员在使用数组时,也必须保证其下标值在正确范围之内,即数组在该下标位置应对应一个元素.

除了程序员自己注意细节,并彻底测试自己的程序之外,没有别的办法可防止数组越界.通过编译并执行的程序仍然存在致命的错误,这并不是不可能的.

-----------------------------------------------------------------华丽的分割线-----------------------------------------------------

小心:导致安全问题的最常见原因就是所谓的"缓冲区溢出(buffer overflow)"错误.当我们在编程时没有检查下标,并且引用了越出数组或其他类似数据结构边界的元素时,就会导致这类错误

----------------------------------------------------------------------华丽,继续--------------------------------------------------------

习题4.6    下面的程序段企图将下标值赋给数组的每个元素,其中在下标操作上有一些错误,请指出这些错误.

const size_t array_size=10;
int ia[array_size];
for(size_t ix=1;ix<=array_size;++ix)
ia[ix]=ix;

维数是10的数组下标从0到9,而没有10,下标越界是非法操作.可改为下列语句:

const size_t array_size=10;
int ia[array_size];
for(size_t ix=0;ix<array_size;++ix)
ia[ix]=ix;

习题4.7  编写必要的代码将一个数组赋给另一个数组,然后把这段代码改用vector实现.考虑如何将一个vector赋给另一个vector.

int main()
{
 const size_t array_size=10;
 int ia1[]={0,1,2,3,4,5,6,7,8,9};
 int ia2[array_size];
 for(size_t ix=0;ix!=array_size;++ix)
  ia2[ix]=ia1[ix];
 return 0;
}
将一个vector赋给另一个vector,也是将一个vector的元素逐个赋值给另一vector的对应元素,可用如下代码实现:

//将一个vector赋给另一vector
//使用迭代器访问vector中的元素
#include<vector>
using namespace std;
int main()
{
 vector<int> ivec1(10,20);  //每个元素初始化为20
 vector<int> ivec2;
 for(vector<int>::iterator iter=ivec1.begin();iter!=ivec1.end();++iter)
  ivec2.push_back(*iter);
 return 0;
}

习题4.8   编写程序判断两个数组是否相等,然后编写一段类似的程序比较两个vector.

判断两个数组是否相等,可用如下程序:

//判断两个数组是否相等
#include<iostream.h>

int main()
{
 const int arr_size=6;
 int ia1[arr_size],ia2[arr_size];
 size_t ix;
 //读入两个数组的元素值
 cout<<"Enter "<<arr_size
  <<" numbers for array1:"<<endl;
 for(ix=0;ix!=arr_size;++ix)
  cin>>ia1[ix];
 cout<<"Enter "<<arr_size
  <<" numbers for array2:"<<endl;
 for(ix=0;ix!=arr_size;++ix)
  cin>>ia2[ix];
 //判断两个数组是否相等
 for(ix=0;ix!=arr_size;++ix)
  if(ia1[ix]!=ia2[ix]){
   cout<<"Array1 is not equal to array2."<<endl;
   return 0;
  }
  cout<<"Array1 is equal to array2."<<endl;
  return 0;
}  cin>>ia2[ix];
 //判断两个数组是否相等
 for(ix=0;ix!=arr_size;++ix)
  if(ia1[ix]!=ia2[ix]){
   cout<<"Array1 is not equal to array2."<<endl;
   return 0;
  }
  cout<<"Array1 is equal to array2."<<endl;
  return 0;
}

//判断两个vector是否相等
//使用迭代器访问vector中的元素
#include<iostream.h>
#include<vrctor.h>
int main()
{
 vector<int> ivec1,ivec2;
 int ival;
 //读入两个vector的元素值
 cout<<"Enter numbers for vector(-1 to end):"<<endl;
 cin>>ival;
 while(ival!=-1){
  ivec.push_back(ival);
  cin>>ival;
 }
 cout<<"Enter numbers for vector(-1 to end):"<<endl;
 cin>>ival;
 while(ival!=-1){
  ivec2.push_back(ival);
  cin>>ival;
 }
 //判断两个vector是否相等
 if(ivec1.size()!=ivec2.size())  //长度不等的vector不相等
  cout<<"Vector1 is not equal to vector2."<<endl;
 else if(ivec.size()==0) //长度都为0的vector相等
  cout<<"Vector1 is equal to vector2."<<endl;
 else{//两个vector长度相等且不为0
  vector<int>::iterator iter1,iter2;
  iter1=ivec1.begin();
  iter2=ivec2.begin();
  while(*iter1==*iter&&iter1!=ivec1.end()&&iter2!=ivec2.end()){
   ++iter1;
   ++iter2;
  }
  if(iter1==ivec1.end())//所有元素都相等
   cout<<"Vector1 is equal to vector2."<<endl;
  else
   cout<<"Vector1 is not equal to vector2."<<endl;
 }
 return 0;
}

上面的程序先是定义了两个容器对象ivec1,ivec2.还有一个用来记录输入的ival变量.接下来输出提示语句,提示用户输入,输入第一个值,然后while循环,不断把输入的数值添加到ivec对象里面,注意,这里用了两句cin>>ival;第一个是触发while循环,第二个是循环所需.然后判断两个ivec对象是否相等.我们知道,当它们长度不等的时候,ivec对象就不相等,第一个判断是根据长度,这也是最好的,长度不等马上测试出对象不等,无需进行下面的语句.如果长度相等,进一步测试,如果两者都是长度为0,则两者相等,这是一种最简单的相等- -.如果两者长度相等且长度都不为0,那么进入下一个判断条件,我们在这个判断条件里面定义了两个迭代器,iter1,iter2,用iter1指向ivec1的开头元素,用iter2指向ivec2的开头元素,然后当iter1跟iter2所指向的元素都相等的时候,且iter1不指向ivec1末尾元素的下一个元素且iter2不指向ivec2末尾元素的下一个元素时,两个迭代器自增,不断比较同位置的元素,知道测试到最后一个元素,都相等的话,那么我们输出语句表示这两个vector对象是相等的,否则的话,它们不相等.   吃力~  -.-

习题4.9   编写程序定义一个有10个int型元素的数组,并以其在数组中的位置作为个元素的初值.

int main()
{
 const size_t array_size=10;
 int ia[array_size];
 for(size_t ix=0;ix!=array_size;++ix)
  ia[ix]=ix+1;
 return 0;
}

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值