文档章节

关于数组

庞宇
 庞宇
发布于 2017/04/01 16:54
字数 775
阅读 3
收藏 0

关于数组的定义

数组是一种最常用的数据结构,我对于数组的定义有两点:1)数组是同一种类型的数据的集合;2)数据应该具有常量级的下标访问操作。这两点定义隐含了数组的实现是使用一块连续虚拟内存。

在C++中,可以通过以下方式创建一个数组:

int static_arr[10];
int *dynamic_arr = new int[10];

我一般称第一种方式为静态数组,第二种为动态数组。对于第二种方式创建的数组,需要显式地去释放它:

delete[] dynamic_arr;

同样地,也可以使用类似的方式去声明非内置类型的数组:

std::string *dynamic_str_arr = new std::string[10];
for (size_t i = 0; i < 10; i++)
{
// do anything to dynamic_str_arr[i]
}
delete[] dynamic_str_arr;

需要注意两点:

1)与创建单个对象一样,使用new关键字去创建一个数组的过程中,其实也是分为两个步骤,申请空间和构造对象,因此,这里会依次调用每一个元素的默认构造函数。这就是为什么不要仅仅使用malloc(size)或者Allocate(size)的方式去创建一个非内置类型的数组,因为采用这种方式创建的数组,仅仅是一块申请下来的空间,对象并没有在上面构造。

2)使用delete去析构数组时,应该加上符号[]去告诉编译器,我释放的地址是数组的地址,这样编译器才会分别取调用每一个元素的析构函数。当元素是内置类型时,可以不加[]符号。

使用动态数组其实是非常麻烦的,需要记录下数组的长度,防止访问越界。当重置数组的长度时,不仅仅需要重新分配内存,而且需要对截断的元素进行析构,对多余的元素进行构造,不幸的是,这些过程都需要程序员手动去调用。

关于数组的封装

STL中提供了vector类,这是一种使用数组实现的顺序容器,但它的行为是一种容器行为,并非纯粹的数组行为。为了增加数据使用效率,vector做了许多额外的操作,有些操作其实并非我们想要的。

在GSystem中,定义了抽象类GArray,这个类同时也是一个模板类。它有很多派生,每一个派生都说明了,其子类具有数组的行为。如GBytes、GString、GVector等,都是带有数组行为的,但这些类本身还具有别的功能特点。

为了模拟上述两种最纯粹的数组行为,定义了静态数组类GStaticArray和动态数组类GDynamicArray。分别位于文件gstaticarray和gdynamicarray。顾名思义,GStaticArray模拟的是第一种创建数组的方式,类似于STL中的std::array。GDynamicArray是动态数组的封装,封装了数组的拷贝、移动、访问、重置和销毁,并且不会产生内存泄漏。

 

 

 

 

© 著作权归作者所有

庞宇
粉丝 0
博文 3
码字总数 2863
作品 0
南京
私信 提问
Es6学习笔记(一)

1、关于let -- let变量必须先声明,后使用 -- 在同一作用域,let不能重复声明 -- let增加了块级作用域,从而从某种意义上取消了自我执行函数 2、关于const -- const只声明一个常量,一旦声明...

小旭依然
2017/05/17
0
0
Java:这是一份全面 & 详细的HashMap 1.7源码分析指南

前言 在 和 开发中非常常见 今天,我将带来 的全部源码分析,希望你们会喜欢。 目录 Entry类实现了Map.Entry接口 即 实现了getKey()、getValue()、equals(Object o)和hashCode()等方法 **/ ...

Carson_Ho
2018/07/05
0
0
Hash源码分析(JDK1.7和1.8的对比)

前言 在 和 开发中非常常见 而 相对于 更新多 今天,我将通过源码分析 ,从而讲解 相对于 的更新内容,希望你们会喜欢。 本文基于版本 ,即 关于版本 ,即 ,具体请看文章Java:手把手带你源...

瑞查德-Jack
01/18
0
0
Python & Numpy 教程(下)

Numpy Numpy是Python科学计算的核心库。它提供了高性能多维数组对象,以及使用这些数组的工具。如果你已经熟悉MATLAB,你可以找到这个教程来开始使用Numpy。 Arrays 一个numpy的数组(array...

zzlyw
2017/03/28
0
0
Java源码分析:HashMap 1.8 相对于1.7 到底更新了什么?

前言 在 和 开发中非常常见 而 相对于 更新多 今天,我将通过源码分析 ,从而讲解 相对于 的更新内容,希望你们会喜欢。 目录 Node = HashMap的内部类,实现了Map.Entry接口,本质是 = 一个映...

Carson_Ho
2018/07/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【JavaScript】callee 与 caller

callee callee是函数参数arguments对象的一个属性,它指向参数arguments对象所在的函数自身。 function foo (x) {console.log(arguments.callee);return x;}foo(); 从控制台中可以看...

小草先森
29分钟前
2
0
全面剖析 Knative Eventing 0.6 版本新特性

摘要: Knative Eventing 0.6 版本已经于5月15号正式发布。相比于0.5版本,此次发布包含了一些重要特性及更新。针对这些新特性以及更新,我们如何快速、精准的定位主要技术点。本篇文章针对这...

阿里云云栖社区
31分钟前
9
0
ffmpeg常用命令

1.合并两个或多个视频文件 将a.flv b.flv合并为c.flv 编辑文件flvs.txt file 'a.flv'file 'b.flv' #ffmpeg -f concat -i flvs.txt -c copy c.flv...

硅谷课堂
32分钟前
1
0
MySQL面试题--常见的四种隔离级别

什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个...

寰宇01
32分钟前
2
0
Docker 安装 reids

0、mac上安装docker brew cask install docker 1、查询reidis docker search redis 2、拉取redis最新版本(也可以拉取指定版本,如:docker pull redis:4.0) docker pull redis 3、查看镜像 ...

moon888
41分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部