第四章 数组和指针
现代c++程序应该尽量使用vector和迭代器类型,而避免使用低级的数组和指针。数组和指针只有在强调速度的时候才在类实现的内部使用数组和指针。
然而,c++程序在相当长的一段时间里依然大量使用数组和指针,c++程序员还必须掌握它。
数组由类型名,标识符,和维数组成。数组的维数必须是大于或等于一的常量表达式。
此常量表达式包括:字面值常量,枚举常量,或者用常量表达式初始化的整型const对象。非const变量以及要到运行才知道值的变量都不可以!!变量不可以(变量要到运行才知道值,不管code上赋值没有)!!
数组的初始化:
const unsigned arrays_size=3;
int ia[array_size]={0,1,2}; //显示初始化
如果没有显示初始化,数组同变量一样:
1、在函数体外,初始化为0;在函数体外,无初始化
2、类类型,调用构造函数,若无构造函数则必须显示初始化
int ia[]={0,1,2,3]; //这样也可以,维数不一定要写,编译器自动确定
const unsigned arrays_size=5;
int ia[]={0,1,2}; // 这样,ia就成了{0,1,2,0,0,0}
特殊的字符数组
char ca1[]={'c','+','+'}; /no null 维度是3
char cal[]={"c++"}; //null terminator added automatically 维度是4
char cal[3]={"c++"}; //将导致编译错误
不允许数组直接复制或者赋值,但某些编译器允许这样做。
习题4.5
列出使用数组而不是vector的缺点:
与vector类型相比,数组具有如下缺点:
(1)数组长度固定,且数组不提供获取其容量大小的size操作;
(2)不提供自动添加元素的push_back操作;
因此,程序编写者无法再程序运行时知道一个给定数组的长度,而且如果需要更改数组的长度,程序编写者只能创建一个足够大的数组,把原数组的所有元素拷贝到新数组中去。
数组与vector相比,使用内置数组的程序更容易出错且难以调试。
数组操作:
下标操作的索引总结:
string使用的是string::size_type,vector使用的是vector<int>::size_type;
bitset和数组使用的是size_t
下标和维度有很大不同,虽然都在[ ]里面,下标可以是变量,而维度不可以。
不可以直接给数组赋值,数组不行vector类型一样可以由另一个vector类型的变量来复制。
但是可以使用下标操作给数组赋值:
#include <iostream>
using namespace std;
const size_t array_size=10;
int ia[array_size];
int main()
{
for(size_t index=0;index<array_size;index++){
ia[index]=index; //将下标值赋给程序的每个元素
cout<<ia[index]<<"\t";
}
return 0;
}
程序员要自己检查数组的下标值,如果越界,会有缓“冲区溢出错误”。
习题4.7
//编写代码把一个数组赋给另一个数组
#include <iostream>
using namespace std;
int main()
{
const size_t array_size=6;
int ia1[]={0,1,2,3,4,5};
int ia2[array_size];
for(size_t index=0;index<array_size;index++){
ia2[index]=ia1[index]
}
return 0;
}
用vector实现:
#include <iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> vec1(10,1); //初始化为10个1
vector<int> vec2(vec1);
for(vector<int>::size_type index=0;index<vec1.size();index++){
cout<<vec1[index]<<"\t";
}
return 0;
}
当然也可以这样:
#include <iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> vec1(10,1); //初始化为10个1
vector<int> vec2(vec1);
for(vector<int>::iterator iter=vec1.begin();iter<vec1.end();iter++){
cout<<*iter<<"\t";
}
return 0;
}
习题4.8
//判断两个数组是否相等
#include <iostream>
using namespace std;
int main()
{
const size_t array_size=5;
int ia1[array_size],ia2[array_size];
size_t ix;
cout<<"Enter "<<array_size<<" numbers for array1:";
for(ix=0;ix!=array_size;++ix){
cin>>ia1[ix];
}
cout<<"Enter "<<array_size<<" numbers for array2:";
for(ix=0;ix!=array_size;++ix){
cin>>ia2[ix];
}
for(ix=0;ix!=array_size;++ix) {
if(ia1[ix]!=ia2[ix]){
cout<<"They are different arrays!"<<endl;
return 0;
}
}
cout<<"They are same arrays!";
return 0;
}
//判断两个vector是否相等
#include <iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> vec1,vec2;
int val;
cout<<"Enter a vector -1 to end"<<endl;
cin>>val;
while(val!=-1){
vec1.push_back(val);
cin>>val;
}
cout<<"Enter another vector"<<"-1 to end"<<endl;
cin>>val;
while(val!=-1){
vec2.push_back(val);
cin>>val;
}
if(vec2.size()!=vec1.size()){
cout<<"Vec1 is not equal to Vec2!"<<endl;
return 0;
}
else if(vec1.size()==0&&vec2.size()==0){
cout<<"Vec1 is equal to Vec2!"<<endl;
return 0;
}
else if(vec1.size()!=0&&vec2.size()==0){
cout<<"Vec1 is not equal to Vec2!"<<endl;
return 0;
}
else if(vec1.size()==0&&vec2.size()!=0){
cout<<"Vec1 is not equal to Vec2!"<<endl;
return 0;
}
else {
vector<int>::iterator iter1,iter2;
iter1=vec1.begin();
iter2=vec2.begin();
for(;iter1!=vec1.end();iter1++,iter2++){
if(*iter1!=*iter2){
cout<<"Vec1 is not equal to Vec2!"<<endl;
return 0;
}
}
}
cout<<"Vec1 is equal to Vec2!"<<endl;
return 0;
}
习题4.9
编写程序定义一个有10个int型元素的数组,以位置做值
#include <iostream>
#include<vector>
using namespace std;
int main()
{
const unsigned array_size=10;
int array1[array_size];
size_t index=0;
for(;index<=array_size;index++){
array1[index]=index;
}
return 0;
}