C++中数组的替代品

一、模板类vector

模板类vector类似于string 类,也是一种动态数组。您可以在运行阶段设置vector对象的长度,可在末尾附加新数据,还可在中间插入新数据。基本上,它是使用new创建动态数组的替代品。实际上,vector类确实使用new和delete来管理内存,但这种工作是自动完成的。

首先要提醒的是,要使用 该模板类,要引用头文件<vector>

其使用方法如下:

vector<typeName> vt(n_elem);

其中typename是类型名,vt则是您想定义的名称,n_elem则是元素个数,n_elem既可以是整型常量,也可以是整型变量。

其应用示例如下:

8cf475cf472f4b16ae162ddf1c398dc3.png

当然了,如果我设置n为2,那就会出现下标越界的现象,系统虽然不会提示,但运行起来会有很大的麻烦,这种模板类虽然可以让系统自动帮你释放内存,但是代价就是牺牲了时间成本,没错,vector运行效率不高,因此,如果您想定义一个长度固定的数组,不妨看一看下面这个模板类。

二、模板类array

与数组一样,array对象的长度也是固定的,也使用栈(静态内存分配),而不是自由存储区,因此其效率与数组相同,但更方便,更安全。要创建array 对象,需要包含头文件array。 array对象的创建语法与vector稍有不同:

 其使用方法如下:

array<typeName,n_elem> arr;

当然了,n_elem只能是常量,不能是变量且书写格式千万不要和vector相混淆了。

dc45953486c844749a4d25d0ffb0bc2f.png

 那么,数组,vector对象以及array对象各自的区别是什么呢?

首先,注意到无论是数组、vector对象还是 array对象,都可使用标准数组表示法来访问各个元素。其次,从地址可知,array对象和数组存储在相同的内存区域(即栈中,而vector 对象存储在另一个区域(自由存储区或堆)中。第三,可以将一个array对象赋给另一个array对象;而对于数组,必须逐元素复制数据。
 复制元素示例如下:

b554ffdefb4f4b31bdfa770337029c6e.png

要注意的是:array创建的对象赋值时两对象中所包含的元素个数及元素类型必须相同,否则无法copy。

ERR :

c2fe1cd6a66b479bb5946498690d864e.png

使用vector和array时如果写下面这个代码,运行起来的时候就会报错:

a3a03260ad994137ba9f23839d5e94a7.png 

这是因为arr[-1]指的是访问arr[0]左边一位的地址,而这个地址不归arr所有,因此这种行为是不安全的,当然,我们可以用成员函数"at"来防止这种现象产生 :

7a15077e185f412c85ec85b44b06a082.png 虽然这种方法可以使您的代码更加安全,但代价就是运行的时间更长。

 到这里,所有内容就全部讲完啦!

 

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
在C语言,没有标准的vector数据结构,但可以通过手动实现动态数组来模拟vector的功能。 下面是一个简单的动态数组实现,可以作为vector的替代品: ```c #include <stdio.h> #include <stdlib.h> typedef struct { int* data; int size; int capacity; } vector; void vector_init(vector* v) { v->size = 0; v->capacity = 4; v->data = malloc(sizeof(int) * v->capacity); } void vector_resize(vector* v, int capacity) { int* data = realloc(v->data, sizeof(int) * capacity); if (data) { v->data = data; v->capacity = capacity; } } void vector_push_back(vector* v, int value) { if (v->size == v->capacity) { vector_resize(v, v->capacity * 2); } v->data[v->size++] = value; } void vector_free(vector* v) { free(v->data); } int main() { vector v; vector_init(&v); for (int i = 0; i < 10; i++) { vector_push_back(&v, i); } for (int i = 0; i < v.size; i++) { printf("%d ", v.data[i]); } printf("\n"); vector_free(&v); return 0; } ``` 这个动态数组实现,vector_init()函数用于初始化动态数组,vector_resize()函数用于调整动态数组的容量,vector_push_back()函数用于在动态数组的尾部添加元素,vector_free()函数用于释放动态数组的内存。 使用时,只需要定义一个vector类型的变量,然后调用相应的函数即可。比如,可以像下面这样使用: ```c vector v; vector_init(&v); vector_push_back(&v, 1); vector_push_back(&v, 2); vector_push_back(&v, 3); for (int i = 0; i < v.size; i++) { printf("%d ", v.data[i]); } vector_free(&v); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘家炫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值