先说一点:数组的长度是固定的.
跟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;
}