目录
c++数组
说到数组,学过C语言的朋友们都不陌生,那么C++数组和C语言数组的区别在哪里呢?
从语法上讲,两者的区别是非常小的,首先c++和C语言的数组定义格式都是
typeName arrayName [arraySize]
第一点不同:
在C语言中,arraySize只能是常量,甚至有const修饰的常量也是不能够参与数组定义。
但是在C++中,arraySize可以是变量,更何况是const常量。
第二点不同:
在数组初始化时,C++有两种方式,如下:
熟悉C语言的朋友应该知道,C语言数组初始化不能省略‘=’。
数组的分类
接下来我们说说C++数组的不同分类,总的来说,数组分为两大类
数组有动态联编和静态联编两种方式
静态联编产生的是静态数组,动态联编产生的是动态数组。
那么区别动态和静态联编的方法是什么呢:
答案是数组长度的确定时间,静态联编的长度确定在编译时,通俗就是数组声明时确定了长度
动态联编的长度确定于运行时,常常使用new来进行动态数组生成。
经常使用数组的朋友应该知道,数组虽然十分实用,但是在有些情况下操作极其复杂,并且数组如果操作不慎,常常有着越界风险。这时候,更加安全便捷的模板类 vector和array就能够替代数组进行操作。
模板类vector
模板类vector是new创建动态数组的替代品,实际上vector也是通过new和delete管理内存的,但是它的这种行为会自动完成,因此它的空间分配在堆区。
要使用模板类vector,必须要包含头文件vector,并且vector在名称空间std中,最后,vector的声明格式为: vector< typeName > vt( n_elem );
其中n_elem是元素个数,在运行过程中确定,可以是整形常量,也可以是整形变量。
vector的成员也是与数组一样通过 vt [index] 进行读取。
总的来说,vector是动态数组的替代品,由于其众多的成员函数,它比数组更简便,更实用,也更安全,但是它的缺点是运行效率较低。
这里介绍一种成员函数
成员函数at()
使用方法,vt. at ( index ), vt为vector创建的一个类型名,如果index不在0-n_elem-1的范围中,将会被程序捕获到非法索引。
这样的函数使用起来让vector相较数组更加安全,但是也使运行效率降低。
模板类array
模板类array是定长数组(静态数组)的替代品,拥有比数组更加方便与安全的特点,其空间分配在栈区。
需要使用array必须包含头文件array,并且其也位于名称空间std中
定义格式如下:
array< typeName , n_elem > arr;
其中n_elem不能是变量
统一的是,at函数在array中也能够使用。array的成员也是与数组一样通过 arr [index] 进行读取。
总的来说,array是定长数组的替代品,由于其功能复杂的成员函数,其功能远远比数组强大,也更安全。
总结
数组是我们常用的一种结构,但是与它的两种替代品vector和array相比,其安全性,功能性,以及便捷度都大大不如,可是两种模板类的运行效率稍微较低,在实际情况中我们可以斟酌使用。