c++primer学习笔记(4.1)数组

本文探讨了C++中的数组与vector的使用,推荐在大多数情况下使用vector代替数组,因为数组长度固定,不提供size操作和自动添加元素功能。数组的下标可以是变量,但容易导致缓冲区溢出错误,而vector提供了更多便利和安全性。同时,文章通过举例说明了数组初始化的各种方式,并指出某些编译器可能允许数组直接复制或赋值,但这不是标准行为。
摘要由CSDN通过智能技术生成

第四章 数组和指针


现代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

编写程序定义一个有10int型元素的数组,以位置做值

#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;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值