vector动态数组

vector是C++中的一种数据结构,确切的说是一个类,它相当于一个动态的数组,当程序员无法知道自己需要的数组长度多大时,使用vector可以达到最大节约空间的目的,也就是实现动态分配数组。

 

举例如下:

 

#include <iostream>
#include <vector>
using namespace std;

void main()
{
    vector <int> array;     //定义一个动态数组
       
    int a = 5,b =10 ;
    array.push_back(a); //将a的值添加到数组的最后
    cout << array[0] << endl//输出结果为5

    array.push_back(b);    //将b的值添加到数组的最后
    cout << array[1] << endl//输出结果为10
   
    return;
}

------------------------------------------------------------------------------

关于vector的成员函数说明如下:

 

1.push_back   在数组的最后添加一个数据
2.pop_back    去掉数组的最后一个数据
3.at                得到编号位置的数据
4.begin           得到数组头的指针
5.end             得到数组的最后一个单元+1的指针
6.front        得到数组头的引用
7.back            得到数组的最后一个单元的引用
8.max_size     得到vector最大可以是多大
9.capacity       当前vector分配的大小
10.size           当前使用数据的大小
11.resize         改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
12.reserve      改变当前vecotr所分配空间的大小
13.erase         删除指针指向的数据项
14.clear          清空当前的vector
15.rbegin        将vector反转后的开始指针返回(其实就是原来的end-1)
16.rend          将vector反转构的结束指针返回(其实就是原来的begin-1)
17.empty        判断vector是否为空
18.swap         与另一个vector交换数据

 

动态数组在C语言中是一种非常重要的数据结构,它允许在运行时动态地分配和调整内存大小。这种灵活性使得动态数组能够有效地管理不确定数量的数据集合。在C语言中,动态数组实现通常依赖于指针和标准库函数如`malloc`、`realloc`以及`free`来完成内存的分配、调整和释放。 ### 动态数组的基本结构 为了实现一个动态数组(通常称为`cvector`),首先需要定义一个结构体来保存动态数组的相关信息,例如当前大小、容量以及指向实际数据存储的指针。下面是一个简单的`Vector`结构体定义: ```c typedef int ElementType; // 可以根据需求更改元素类型 typedef struct Vector { ElementType *data; // 指向数据的指针 int size; // 当前元素数量 int capacity; // 当前容量 } Vector; ``` ### 创建和销毁动态数组 创建动态数组时,需要为其分配初始内存空间。通常我们会设定一个初始容量,当数组满载时再进行扩容操作。销毁动态数组时,则需要释放之前分配的所有内存资源。 ```c // 创建一个动态数组 Vector* create_vector(int initial_capacity) { Vector *v = (Vector*)malloc(sizeof(Vector)); if (v == NULL) { // 分配失败处理 return NULL; } v->data = (ElementType*)malloc(initial_capacity * sizeof(ElementType)); if (v->data == NULL) { free(v); return NULL; } v->size = 0; v->capacity = initial_capacity; return v; } // 销毁一个动态数组,释放内存 void destory_vector(Vector *v) { if (v != NULL) { free(v->data); free(v); } } ``` ### 添加元素 向动态数组中添加元素是常见操作之一。当向数组末尾添加元素时,如果当前容量不足以容纳新元素,则需要对数组进行扩容。扩容通常是通过`realloc`函数实现的,该函数可以调整已分配内存块的大小[^3]。 ```c // 向动态数组末尾添加一个元素 void vector_push_back(Vector *v, ElementType val) { if (v == NULL) { // Vector不能是NULL return; } if (v->size == v->capacity) { // 容量不足,扩容 v->capacity *= 2; // 扩容策略,这里简单地将容量翻倍 ElementType *new_data = (ElementType*)realloc(v->data, v->capacity * sizeof(ElementType)); if (new_data != NULL) { v->data = new_data; } else { // 处理分配失败的情况 return; } } v->data[v->size++] = val; } // 在动态数组最前面添加元素,所有元素依次后移 void vector_push_front(Vector *v, ElementType element) { if (v == NULL) { return; } if (v->size == v->capacity) { v->capacity *= 2; ElementType *new_data = (ElementType*)realloc(v->data, v->capacity * sizeof(ElementType)); if (new_data != NULL) { v->data = new_data; } else { return; } } for (int i = v->size; i > 0; --i) { v->data[i] = v->data[i - 1]; } v->data[0] = element; ++v->size; } // 将元素val添加到索引为idx的位置,idx后面的元素依次后移 void vector_insert(Vector *v, int idx, ElementType val) { if (v == NULL || idx < 0 || idx > v->size) { return; } if (v->size == v->capacity) { v->capacity *= 2; ElementType *new_data = (ElementType*)realloc(v->data, v->capacity * sizeof(ElementType)); if (new_data != NULL) { v->data = new_data; } else { return; } } for (int i = v->size; i > idx; --i) { v->data[i] = v->data[i - 1]; } v->data[idx] = val; ++v->size; } ``` ### 打印动态数组 遍历打印整个`Vector`动态数组可以帮助我们检查数组的内容是否正确。 ```c // 遍历打印整个Vector动态数组 void vector_print(Vector *v) { if (v == NULL) { return; } for (int i = 0; i < v->size; ++i) { printf("%d ", v->data[i]); } printf("\n"); } ``` ### 清空和析构操作 清空动态数组意味着移除所有元素,但保留其容量不变。而析构操作则是彻底释放动态数组占用的所有资源。 ```c // 清空数组 void vector_clear(Vector *v) { if (v == NULL || v->size == 0) { return; } memset(v->data, 0, v->size * sizeof(ElementType)); v->size = 0; } // 析构函数,释放动态分配的内存 void vector_free(Vector *v) { if (v != NULL) { free(v->data); free(v); } } ``` ### 宏定义简化构造函数调用 为了简化构造函数的调用,我们可以使用宏定义来隐藏一些细节,使代码更加简洁易读。 ```c // 简化构造函数的调用 #define VECTOR(type, name, capacity) Vector name; vector_init(&name, capacity, sizeof(type)) #define VECTOR_GET(type, name, index) *(type*)vector_get(&name, index) #define VECTOR_FRONT(type, name) *(type*)vector_front(&name) #define VECTOR_BACK(type, name) *(type*)vector_back(&name) ``` 以上就是C语言中实现动态数组的一些基本方法。这些函数提供了创建、销毁、添加、插入、打印、清空及析构等基础功能,为构建更复杂的应用打下了坚实的基础。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值