参考:《10.1,10.2关联容器—-三种构造函数》
http://blog.csdn.net/hlsdbd1990/article/details/46438003
参考:《 4.1 数组 —-显示的初始化》
http://blog.csdn.net/hlsdbd1990/article/details/45561403
参考:《 12.4.5 类成员的显示初始化》
http://write.blog.csdn.net/mdeditor#!postId=46605673
简介
c++语言提供两种类似于vector和迭代器的低级复合类型—-数组和指针。
数组与vector相比,有如下缺点:
- 数组长度固定,不提供获取其容量大小的的size操作,也不提供自动添加元素的push_back 操作;
- 我们无法在程序运行时知道一个给定的数组的长度;
- 如果需要更改数组的长度,程序员需要创建一个更大的新数组,然后把原数组的所有元素复制到新数组的存储空间中去;
- 更容易出错,难以调试
=======================================================================================
一、数组的定义和初始化
1、数组的维数
- 数组的维数必须是大于等于1的常量表达式,此常量表达式只能包含整型字面值常量(1、2、3这种)、枚举常量和用常量表达式初始化的整型 const对象。
(看后面的例子 )
- 非const变量以及要到运行阶段才知道值的const变量都不能用于定义数组的维数。
2、数组的初始化
显示初始化:显示地提供初值 int ia[]={1,2,3}
《12.4.5 类的显示初始化》里边也有提到,容器里面的初始化都是通过构造函数的,没有显示的初始化
隐式初始化:没有显示提供初值
- 在函数体外定义的内置整型数组,其元素均初始化为0;
- 在函数体内定义的内置整型数组,其元素无初始化。
- 如果是string 类型数组,如果没有显示初始化,那么无论在函数内还是外都初始化为空串
- 不允许数组直接复制和赋值。一个数组不能给另外一个数组初始化,也不能将一个数组赋值给另外一个数组,操作非法。
int ia[]={1,2,3};//显示初始化
int ia2[](ia);
int main()
{
const unsigned array_size=3;
int ia3[array_size];
ia3=ia; //错误!!!!不能用数组直接复制
int ia4[]=ia;//错误,不能用一个数组来初始化另一个数组
return 0;
}
//哪些是可以定义的
int main()
{
const unsigned buf_size=512,max_files=20;
int staff_size=27 //不是const变量
const unsigned sz=get_size();//const 型变量,但一定要到运行阶段才知道其值;
char input_buffer[buf_size];//可以,因为下标是一个const变量
string fileTable[max_files+1];//可以,因为max_files是const变量,所以max_files+1常量表达式
double salaries[staff_size];// 不行,因为下标不是const变量
int test_scores[get_size];//不行,不是常量表达式
int vals[sz];//不行,运行时才知道sz值
}
3、特殊的字符数组
- 字符数组既可以用一组由花括号括起来、逗号隔开的字符字面值进行初始化,也可以用一个字符串字面值进行初始化;
- 这两种初始化形式不完全相同,字符串字面值包含一个额外的空字符(null)用于结束字符串。
当使用字符串字面值来初始化创建的新数组时,将在新数组中加入空字符。
注:好像涉及到字符串字面值的时候都会在后面额外添加一个空字符!
* 注意最后面三个例子的区别*还有vector对象的初始化有哪些,记住它和数组初始化的区别,看前面一个章节,vector在没初始化之前是不能通过下标值进行初始化的,下标值只能访问里面的元素,并不能改变vector里面的值,要想改变可以通过push_back操作和iterator迭代器。
//important
char ca1[]={'c','+','+'}; //维数是3
char ca2[]={'c','+','+','\0'};//维数是4
char ca3[]="c++"; //维数是4,自动在末尾添加一个\0
char ca4[5]="hello";
//将导致编译出错!!!因为字符串字面值hello包含了5个显示字符,但是存放该字符
//串的数组必须有6个元素------5个用于存储字面值,一个用于存储null空字符
char ca4[5]={'h','e','l','l','o'};
///这个就是对的!!!
vector<int> ivec={0,1,2,4,6,78};
//错误!!!!vector对象不能用这种方式初始化
二、数组操作
1、数组操作
- 下标访问vector中的元素,用vector::size_type类型作为下标的类型;
- 下标访问数组中的元素,用size_t类型作为下标的类型。
int main ()
{
const size_t arrar_size=10;//下标类型是size_t类型
int ia[arrar_size];
for(size_t ix=0;ix!=arrar_size;ix++)
ia[ix]=ix;
for(size_t ix=0;ix!=arrar_size;ix++)
cout<<ia[ix]<<endl;
return 0;
}