c++入门之内置数组和array比较

array是C++11中新提出来的容器类型,与内置数组相比,array是一种更容易使用,更加安全的数组类型,可以用来替代内置数组。作为数组的升级版,继承了数组最基本的特性,也融入了很多容器操作,下面介绍array和内置数组。

array和数组一样,是一种固定大小的容器类型,在定义的时候就要声明大小和类型。

定义和初始化:

数组的初始化有两种:默认初始化和列表初始化

int arr[10]; //10个值为0的int型整数

int arr[5]={1,2,3,4,5};

int arr[]={1,2,3};//维度为3 的数组,显式的列出所有元素

int arr[5]={1,2,3};显式的初始化数组的前三个元素,剩下的元素默认初始化

数组初始化不能直接使用拷贝和赋值!!!数组的传递只能是遍历的形式来拷贝

array的初始化:和数组初始化差不多

array<int,10> ial;

array<int,10> ial1={0,1,2,3};

和数组不同的是,array可以使用拷贝和赋值的形式进行初始化

array<int,10> copy=ial1;//只要保证两者的类型一致就可以(包括元素类型和大小)

使用方式:

数组的访问:下标、指针、迭代器(和vector、array一样在内存中都是使用连续内存)

使用下标可以随机访问数组的元素,注意不要超出数组合理的范围。标准库中的vector、string和array对于下标的运算要求下标必须是无符号类型,而数组则没有这个限制。

例如:int *p=&arr[2];//p指向数组的第三个元素,指针的起点是在第三个元素

int j=p[1];//p[1]等价于*(p+1),也就是arr[3]

int i=p[-2];//等价于*(p-2),也就是arr[0]

只要保证指针运算后还在数组的范围内即可

数组名其实就是指向第一个元素的指针

int *p=arr;或者int *p=&arr[0];都是可以的,或者直接就用数组名作为指针进行运算。

在c++11中给数组提供了更加安全的访问方式,类似于迭代器的操作,但是数组不是类类型,并没有成员函数,新标准中引入了begin()和end()函数

int *beg=begin(arr);//指向首元素

int *last=end(arr);//指向尾元素的下一个

同理,如果要是遍历数组,同样可以使用范围for语句。

array的使用

array与数组最大的区别是array是一种容器类型,它支持一系列容器操作,但是它和数组更接近,很多通用的容器操作它却不支持,因此在这里和数组来比较。

下面从容器的角度来看array的区别

1.不支持局部拷贝

例如不允许C c(b, e);//将迭代器b和e之间的元素拷贝到c

不允许用C1={a,b,c...};用列表中的元素替换C1

2.不允许添加或删除元素,因为array是固定大小的。

相比于数组,array可以使用成员函数。其中包括:

1.可以使用拷贝和赋值,只要保证类型一致即可

2.使用swap函数,a.swap(b);或者swap(a,b);交换两者的元素

3.使用正向和反向迭代器

array是数组的升级版,将数组正式纳入到容器的范畴。array在使用和性能上都要强于内置数组,对于一些固定大小的使用场景,可以用array来替代原先数组的工作。

---------------------
作者:微燃
来源:CSDN
原文:https://blog.csdn.net/u011405218/article/details/70653323?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/shaonianpi/p/9801081.html

时间: 2024-10-30 02:23:51

c++入门之内置数组和array比较的相关文章

Swift入门(五)——数组(Array)

集合 集合的定义 Swift中提供了两种数据结构用于存放数据的集合,分别是数组(Array)和字典(Dictionary).他们的主要区别在于数组中的元素由下标确定,而字典中的数据的值由数据的键(Key)决定.以下我们认为集合就是数组或字典. 集合的可变性 我们可以定义一个集合常量或者集合变量.一旦定义为常量,就意味着集合的长度.内容和顺序都不能再修改了.比如,定义为常量的数组,不能再向其中添加新的元素. 数组的创建 由于swift中变量的创建遵循" var 变量名:变量类型 "的语法

PHP中的数组(Array)

定义数组的方式: 使用array内置关键字 使用[]定义 直接赋值 <?phpecho '<pre>'; //定义数组的方式////1.使用array内置关键字$arr = array(1,2,4);print_r($arr); //2.使用[]定义$brr = [1,2,4];print_r($brr); //3.直接赋值$crr[] = 1;$crr[] = 2;$crr[] = 4; print_r($crr); $drr[1] = 1;$drr[2] = 2;$drr[3] = 

js基础之内置对象

String对象:处理所有的字符串操作  Math对象:处理所有的数学运算  Date对象:处理日期和时间的存储.转化和表达  Array对象:提供一个数组的模型.存储大量有序的数据  Event对象:提供JavaScript事件的各种处理信息 内置对象都有自己的方法和属性,访问的方法如下: 对象名.属性名称 对象名.方法名称(参数表) String(字符串对象): 方法 String 对字符串的支持 String.charAt( ) 返回字符串中的第n个字符 String.charCodeAt

OpenGL中glVertex、显示列表(glCallList)、顶点数组(Vertex array)、VBO及VAO区别

OpenGL中glVertex.显示列表(glCallList).顶点数组(Vertex array).VBO及VAO区别 1.glVertex 最原始的设置顶点方法,在glBegin和glEnd之间使用.OpenGL3.0已经废弃此方法.每个glVertex与GPU进行一次通信,十分低效. glBegin(GL_TRIANGLES); glVertex(0, 0); glVertex(1, 1); glVertex(2, 2); glEnd(); 2.显示列表(glCallList) 每个gl

javascript中的稀疏数组(sparse array)和密集数组

学习underscore.js数组相关API的时候,遇到了sparse array这个东西,以前没有接触过. 这里学习下什么是稀疏数组和密集数组. 什么是密集数组呢?在java和C语言中,数组是一片连续的存储空间,有着固定的长度.加入数组其实位置是address,长度为n,那么占用的存储空间是address[0],address[1],address[2].......address[n-1].即数组元素之间是紧密相连的,不存在空隙.如下的js代码创建的就是一个密集数组 var data = [

17、Cocos2dx 3.0游戏开发找小三之内置的常用层:三剑客LayerColor、LayerGradient、Menu

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30477587 为了方便游戏开发者,Cocos2d-x 内置了 3 种特殊的 Layer: 具体如下所示: LayerColor:一个单纯的实心色块. LayerGradient:一个色块,但可以设置两种颜色的渐变效果. Menu:十分常用的游戏菜单. LayerColor 与 与 LayerGradient 这两个层十分简单,都仅仅包含一个色块. 不同

.net框架-数组(Array)&amp; ArrayList &amp; List

数组(Array)特点: 初始化时规定长度 元素类型相同 数据存储连续,效率高 System.Collections.ArrayList : 初始化时无需规定长度,长度随存储的数据动态扩充与收缩 元素类型可以不相同,其内部使用object[]实现数据存储,因此会数据读写时会频敏装箱.拆箱从而影响效率 继承接口:IList.ICollection.IEnumerable.ICloneable,数据增.删.改查十分方便 System.Collections.Generic.List<T>: 范型类

JS数组(Array)操作汇总

1.去掉重复的数组元素.2.获取一个数组中的重复项.3.求一个字符串的字节长度,一个英文字符占用一个字节,一个中文字符占用两个字节.4.判断一个字符串中出现次数最多的字符,统计这个次数.5.数组排序. 6.快排. 7.删除/添加数组项. 8.数组随机顺序输出. 9.数组求和.最大值. 10.判断是否为数组. 11.冒泡排序. 1.去掉重复的数组元素. Array.prototype.unique = function() { var ret = []; var o = {}; for(var i

老李分享:持续集成学好jenkins之内置命令

老李分享:持续集成学好jenkins之内置命令 Jenkins命令调用方式:调用Jenkins命令设置job的描述信息. $JAVA_BIN-jar "$JENKINS_CLI_JAR" -s "$JENKINS_URL"  set-build-description "${JOB_NAME}""${BUILD_NUMBER}" "$tag_name" --username "$SVN_USERN