c/c++动态数组

来源:互联网 发布:手机淘宝开店教程视频 编辑:程序博客网 时间:2024/05/22 04:43

接口文件

#ifndef __VERCTOR_ARRAY_H__
#define __VERCTOR_ARRAY_H__


//动态数组的对象结构
struct vector_array{
    unsigned char* mem_data;//存放数组元素的内存地址,内存是分配在堆上的
    int max_elem; // 当前内存最大容量
    int elem_count; // 当前内存存放的元素个数
    int sizeof_elem; //每个元素所占的内存大小
};
//end


//定义配置这个动态数组存放了那种类型的元素
void verctor_define(struct vector_array* v, int sizeof_elem);


// 清楚掉我们动态数组在堆上为元素分配的内存,动态数组将不会存放任何数据;
void vector_clear(struct vector_array* v);



//往动态数组最后存放元素
void vector_push_back(struct vector_array* v, const void* elem_ptr);

//获取第i个元素的内存地址
void* vector_at(struct vector_array* v, int i);

//获取数组存放的内存的首地址
void* vector_begin(struct vector_array* v);

//删除数组里面的元素,从start开始删除count个
void vector_erase(struct vector_array* v, int start, int count);

//获取数组当前元素个数
#define vector_size(v) ((v)->elem_count)

//清除数组里面的所有元素,内存还是继续使用
void vector_popall(struct vector_array* v);

//弹出数组最后一个元素,并把最后一个元素的值写到输出内存地址中
void vector_popback(struct vector_array* v, void* out_of_elem);


//弹出动态数组的第一个元素;
void vector_popfront(struct vector_array* v, void* out_of_elem);

#endif



c文件源码


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "vector_array.h"


#define my_malloc malloc
#define my_free free
#define my_realloc realloc

#define ELEM_STEP 64

void verctor_define(struct vector_array* v, int sizeof_elem){
    memset(v, 0, sizeof(struct vector_array));
    v->sizeof_elem = sizeof_elem;
}

void vector_clear(struct vector_array* v){
    if (v->mem_data){
        my_free(v->mem_data);
        v->mem_data = NULL;
    }
    v->elem_count = 0;
    v->max_elem = 0;
}

void vector_push_back(struct vector_array* v, const void* elem_ptr){
    //判断当前内存地址的数据是否已满
    if (v->elem_count >= v->max_elem){
        v->max_elem += ELEM_STEP;
        v->mem_data = my_realloc(v->mem_data, v->max_elem * v->sizeof_elem);
    }
    //存放元素,存放位置为当前内存地址+ 现在元素个数 * 元素大小
    memcpy(v->mem_data + v->elem_count * v->sizeof_elem, elem_ptr, v->sizeof_elem);
    v->elem_count++;
}

void* vector_at(struct vector_array* v, int i){
    if (i < 0 || i >= v->elem_count){
        return NULL;
    }
    return (void*)(v->mem_data + i * v->sizeof_elem);
}

void* vector_begin(struct vector_array* v){
    return  v->mem_data;
}

void vector_erase(struct vector_array* v, int start, int count){
    //判断删除个数索引的合法性
    if (start < 0 || start >= v->elem_count){
        return;
    }

    if (start + count >v->elem_count){
        count -= ((start + count) - v->elem_count);    //如果删除个数大于数组元素个数 ,就把多余的部分减掉,相当于删除start后面所有的元素

    }

    if ((v->elem_count - (start + count) > 0)){
        memmove(v->mem_data + start * v->sizeof_elem,  //目标地址
            v->mem_data + (start + count) * v->sizeof_elem,   //原地址
            (v->elem_count - (start + count)) * v->sizeof_elem);  //移动字节数
    }
    v->elem_count -= count;
}

void vector_popall(struct vector_array* v){
    v->elem_count = 0;  //把元素个数设置为0 当下次存储新元素的时候,就会覆盖,就相当于清除了内存地址
}

void vector_popback(struct vector_array* v, void* out_of_elem){
    if (v->elem_count <= 0){
        return;
    }

    v->elem_count--;

    if (out_of_elem){
        memcpy(out_of_elem, v->mem_data + v->elem_count * v->sizeof_elem, v->sizeof_elem);  //因为减掉了1个元素,所以原地址为count*size
    }
}


void vector_popfront(struct vector_array* v, void* out_of_elem){
    if (v->elem_count <= 0){
        return;
    }



    v->elem_count--;

    if (out_of_elem){
        memcpy(out_of_elem, v->mem_data, v->sizeof_elem);   //因为之前没有减掉1个数量,所以源地址为(count - 1) * size
    }

    if (v->elem_count > 0){
        memmove(v->mem_data, v->mem_data + v->sizeof_elem, v->elem_count * v->sizeof_elem);  //把数据移动到第一个地址位置,相当于把第一个元素删除掉了
    }

}



使用main.c


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "./vector_array.h"

int main(int argc, char** argv){

    int b = 4;
    struct vector_array array;

    verctor_define(&array, sizeof(int));

    vector_push_back(&array, &b);

    b = 8;
    vector_push_back(&array, &b);

    b = 16;
    vector_push_back(&array, &b);

    int *ptr = NULL;

    ptr = vector_at(&array, 2);

    printf("第2个元素 = %d\n", *ptr);


    int last;
    int first;
    vector_popfront(&array, &first);
    vector_popback(&array, &last);

    

    printf("first = %d\n", first);
    printf("last = %d\n", last);

    //遍历数组
    printf("*********遍历数组********\n");

    ptr = vector_begin(&array);

    for (int i = 0; i < vector_size(&array); i++){
        printf("%d\n", ptr[i]);
    }
    

    



    printf("*************************\n");
    vector_clear(&array);

    system("pause");
    return 0;
}




原创粉丝点击