已经重新整理,并且拆分成多文件,阅读更方便
函数众多都只是简单测试了,不保证没有BUG,有兴趣的可以拷贝下来测试
众所周知vector是C++中的,但c没有所以就写了这个,尽量将名字都写成一样的,好方便后期使用
因为c没有模板这个概念,所以此代码为了实现所有数据类型,本身是无类型的,采用内存拷贝实现。
内置函数获取的数据都是以void指针的形式返回,需要强转成自己使用的类型。
目录
void Vector_Push_Back(vector* vec, void* x);// 向量尾部增加一个元素X
void Vector_insert_front(struct vector* vec, const void* p, const void* x);// 向量中指向元素p前增加一个元素x
void Vector_pop_back(struct vector* vec);//删除向量中最后一个元素
void Vector_erase_p(struct vector* vec, const void* p1, const void* p2);//删除指针区间内的数据
void Vector_erase_int(struct vector* vec, const int left, const int right);//删除区间内的数据
void Vector_clear(struct vector* vec);//清空vector的队列,释放内存
void* Vector_at(const struct vector* vec, int i);// 返回元素的指针,以数组下标形式访问
void* Vector_front(const struct vector* vec);//返回向量头指针,指向第一个元素
void* Vector_back(const struct vector* vec);//返回向量尾指针,指向向量最后一个元素
void* Vector_find(const struct vector* vec, const void* val);//查找数据,返回找到的指针,没有返回NULL
bool Vector_empty(const struct vector* vec);//检测vector内是否为空,空为真 O(1)
int Vector_size(const struct vector* vec);//返回vector内元素的个数 O(1)
int Vector_capacity(const struct vector* vec);//返回当前向量所能容纳的最大元素值
void Vector_sort(struct vector* vec,bool (*Sort)(void *x,void *y));//排序
void Vector_swap(struct vector*vec1, struct vector*vec2);//交换两个同类型向量的数据
void VectorInitial(vector* vec, int n);//初始化函数
内置函数
插入函数
void Vector_Push_Back(vector* vec, void* x);// 向量尾部增加一个元素X
void Vector_Push_Back(vector* vec,void* x)// 向量尾部增加一个元素X
{
Capacity(vec);
char* str1 = (char*)vec->_date + vec->_type * vec->_current;
memcpy(str1,x, vec->_type);
vec->_current++;
}
void Vector_insert_front(struct vector* vec, const void* p, const void* x);// 向量中指向元素p前增加一个元素x
void Vector_insert_front(vector* vec,const void* p, const void* x)// 向量中指向元素p前增加一个元素x
{
Capacity(vec);
if (p >= vec->front(vec) && p <= vec->back(vec))
{
int size = (char*)vec->back(vec) - p + vec->_type;
void* ptr = malloc(size);
memcpy(ptr, p, size);
memcpy(p, x, vec->_type);
memcpy((char*)p + vec->_type, ptr, size);
vec->_current++;
free(ptr);
}
}
void Vector_insert_nfront(struct vector* vec, const void* p, const int n, const void* x);// 向量中指向元素p前增加n个相同的元素x
void Vector_insert_nfront(vector* vec, const void* p, const int n, const void* x)// 向量中指向元素p前增加n个相同的元素x
{
if (p >= vec->front(vec) && p <= vec->back(vec))
{
Capacity(vec);
int size = (char*)vec->back(vec) - p + vec->_type;
void* ptr = malloc(size);
memcpy(ptr, p, size);
int sizen= ((char*)p-vec->front(vec))/vec->_type;
for (size_t i = 0; i < n; i++)
{
Capacity(vec);
memcpy((char*)vec->at(vec,sizen), x, vec->_type);
sizen++;
vec->_current++;
}
memcpy((char*)vec->at(vec, sizen), ptr, size);
free(ptr);
}
}
void Vector_insert(struct vector* vec, const void* p, const void* p1, const void* p2);// 向量中指向元素p前插入另一个相同类型向量的指针[p1,p2)间的数据
void Vector_insert(vector* vec, const void* p, const void* p1, const void* p2)// 向量中指向元素p前插入另一个相同类型向量的指针[p1,p2)间的数据
{
if (p >= vec->front(vec) && p <= vec->back(vec))
{
Capacity(vec);
int size = (char*)vec->back(vec) - p + vec->_type;
void* ptr = malloc(size);
memcpy(ptr, p, size);
int sizen = ((char*)p - vec->front(vec)) / vec->_type;
int push_n = ((char*)p2 - (char*)p1) / vec->_type+1;
for (size_t i = 0; i < push_n; i++)
{
Capacity(vec);
memcpy((char*)vec->at(vec, sizen),(char*)p1+i*vec->_type, vec->_type);
sizen++;
vec->_current++;
}
memcpy((char*)vec->at(vec, sizen), ptr, size);
free(ptr);
}
}
删除函数
void Vector_pop_back(struct vector* vec);//删除向量中最后一个元素
void Vector_pop_back(struct vector* vec)//删除向量中最后一个元素
{
vec->_current--;
}
void Vector_erase_p(struct vector* vec, const void* p1, const void* p2);//删除指针区间内的数据
void Vector_erase_p(struct vector* vec, const void* p1, const void* p2)//删除指针区间内的数据
{
if (p1<=p2&&vec->front(vec)<=p1&&p2<=vec->back(vec))
{
memcpy(p1, (char*)p2 + vec->_type,(int)((char*)vec->back(vec)-(char*)p2));
vec->_current -= (((int)((char*)p2 - (char*)p1))/vec->_type+1);
}
}
void Vector_erase_int(struct vector* vec, const int left, const int right);//删除区间内的数据
void Vector_erase_int(struct VECTOR* vec, const int left, const int right)//删除区间内的数据
{
if (left <= right && left >= 0 && right < vec->_current)
{
memcpy(vec->at(vec,left),vec->at(vec,right+1),(vec->_current-1-right)*vec->_type);
vec->_current -= (right - left + 1);
}
}
void Vector_clear(struct vector* vec);//清空vector的队列,释放内存
void Vector_clear(struct vector* vec)//清空vector的数组,释放内存
{
free(vec->_date);
vec->_date = NULL;
vec->_current = 0;
vec->_size = 0;
}
遍历函数
void* Vector_at(const struct vector* vec, int i);// 返回元素的指针,以数组下标形式访问
void* Vector_at(const struct vector* vec, int i)// 返回元素的指针
{
if (i+1 > vec->_current)
{
return NULL