@@ -11,6 +11,13 @@
# include "vector.h"
# include <stdlib.h>
/**
* @brief 创建新的数组容器
*
* @param elem_size
* @param initial_capacity
* @return vector_t*
*/
vector_t * vector_create ( size_t elem_size , size_t initial_capacity ) {
vector_t * vec = malloc ( sizeof ( vector_t ) ) ;
if ( ! vec ) return NULL ;
@@ -21,29 +28,126 @@ vector_t *vector_create(size_t elem_size, size_t initial_capacity){
vec - > capacity = initial_capacity > 0 ? initial_capacity : 1 ;
vec - > data = malloc ( vec - > capacity * elem_size ) ;
if ( ! vec - > data ) {
free ( vec ) ;
free ( vec ) ; //内存初始化失败, 释放vec
vec = NULL ; // 确保vec为NULL以避免后续操作出现问题
return NULL ;
}
return vec ;
}
/**
* @brief 销毁容器
*
* @param vec
* @return true
* @return false
*/
bool vector_destroy ( vector_t * vec ) {
if ( vec ) {
if ( ! vec - > data ) { //虽然data指针可能为NULL, 但内存可以被释放
free ( vec ) ;
return true ;
}
free ( vec - > data ) ;
free ( vec ) ;
return true ;
}
return false ;
if ( ! vec ) return false ;
free ( vec - > data ) ;
free ( vec ) ;
vec = NULL ; // 确保vec为NULL以避免后续操作出现问题
return true ;
}
/**
* @brief 扩容
*
* @param vec
* @return true
* @return false
*/
static bool _vector_extend_capacity_ ( vector_t * vec ) {
if ( ! vec ) return false ; // 检查vec是否为NULL
size_t new_capacity = vec - > capacity * 2 ; // 扩容为原来的两倍
void * new_data = realloc ( vec - > data , new_capacity * vec - > elem_size ) ;
if ( ! new_data ) return false ; // 内存分配失败
vec - > data = new_data ;
vec - > capacity = new_capacity ;
return true ; // 成功扩容
}
/**
* @brief 向向量末尾 添加元素
* @brief 向指定索引位置 添加元素
*
* @param vec
* @param index 要添加的索引, 索引从0开始
* @param elem 数据内容
* @return true
* @return false
*/
bool vector_add_at ( vector_t * vec , size_t index , const void * elem ) {
if ( ! vec | | ! elem | | index > vec - > size ) return false ; // 检查vec、elem是否为NULL或索引越界
if ( vec - > size > = vec - > capacity ) { // 如果当前容量不足,尝试扩容
if ( _vector_extend_capacity_ ( vec ) = = false ) {
return false ; // 扩容失败
}
}
void * target = vec - > data + ( index * vec - > elem_size ) ;
memmove ( target + vec - > elem_size , target , ( vec - > size - index ) * vec - > elem_size ) ; // 移动元素
memcpy ( target , elem , vec - > elem_size ) ; // 插入新元素
vec - > size + + ;
return true ; // 成功添加元素
}
/**
* @brief 交换指定索引位置的两个元素
*
* @param vec
* @param index1
* @param index2
* @return true
* @return false
*/
bool vector_swap ( vector_t * vec , size_t index1 , size_t index2 ) {
if ( ! vec | | index1 > = vec - > size | | index2 > = vec - > size ) return false ; // 检查vec是否为NULL或索引越界
if ( index1 = = index2 ) return true ; // 如果索引相同,无需交换
void * elem1 = ( void * ) vec - > data + ( index1 * vec - > elem_size ) ; // 获取第一个元素的指针
void * elem2 = ( void * ) vec - > data + ( index2 * vec - > elem_size ) ; // 获取第二个元素的指针
char temp [ vec - > elem_size ] ; // 临时存储空间
memcpy ( temp , elem1 , vec - > elem_size ) ; // 交换元素
memcpy ( elem1 , elem2 , vec - > elem_size ) ; //
memcpy ( elem2 , temp , vec - > elem_size ) ; //
return true ; // 成功交换元素
}
/**
* @brief 删除指定索引位置的元素
*
* @param vec
* @param index
* @return true
* @return false
*/
bool vector_remove_at ( vector_t * vec , size_t index ) {
if ( ! vec | | index > = vec - > size ) return false ; // 检查vec是否为NULL或索引越界
void * target = vec - > data + ( index * vec - > elem_size ) ;
memmove ( target , target + vec - > elem_size , ( vec - > size - index - 1 ) * vec - > elem_size ) ; // 移动元素
vec - > size - - ;
return true ; // 成功删除元素
}
/**
* @brief 获取容器已使用的元素数量
*
* @param vec
* @return size_t
*/
size_t vector_used ( const vector_t * vec ) {
if ( ! vec ) return 0 ; // 检查vec是否为NULL
return vec - > size ;
}
/**
* @brief 向容器末尾添加元素
*
* @param vec
* @param elem
@@ -53,12 +157,10 @@ bool vector_destroy(vector_t *vec) {
bool vector_push_back ( vector_t * vec , const void * elem ) {
if ( ! vec | | ! elem ) return false ; // 检查vec和elem是否为NULL
if ( vec - > size > = vec - > capacity ) {
size_t new_capacity = vec - > capacity * 2 ;
void * new_data = realloc ( vec - > data , new_capacity * vec - > elem_size ) ;
if ( ! new_data ) return false ; // 内存分配失败
vec - > data = new_data ;
vec - > capacity = new_capacity ;
if ( vec - > size > = vec - > capacity ) { // 如果当前容量不足,尝试扩容
if ( _vector_extend_capacity_ ( vec ) = = false ) {
return false ; // 扩容失败
}
}
void * target = ( char * ) vec - > data + ( vec - > size * vec - > elem_size ) ;
@@ -68,7 +170,7 @@ bool vector_push_back(vector_t *vec, const void *elem){
}
/**
* @brief
* @brief 从容器尾部删除元素
*
* @param vec
* @return true
@@ -77,7 +179,7 @@ bool vector_push_back(vector_t *vec, const void *elem){
bool vector_pop_back ( vector_t * vec ) {
if ( ! vec | | vec - > size = = 0 ) return false ; // 检查vec是否为NULL或空
vec - > size - - ;
vec - > size - - ; // 减少元素数量
if ( vec - > size < vec - > capacity / 4 ) {
size_t new_capacity = vec - > capacity / 2 ;
if ( new_capacity < 1 ) new_capacity = 1 ; // 确保容量至少为1
@@ -97,7 +199,7 @@ bool vector_pop_back(vector_t *vec){
* @param index 索引从0开始
* @return void*
*/
void * vector_get ( const vector_t * vec , uint32 _t index ) {
void * vector_get ( const vector_t * vec , size _t index ) {
if ( ! vec | | index > = vec - > size ) return NULL ; // 检查vec是否为NULL或索引越界
return ( void * ) vec - > data + ( index * vec - > elem_size ) ; // 返回指定索引的元素指针
@@ -112,7 +214,7 @@ void *vector_get(const vector_t *vec, uint32_t index){
* @return true
* @return false
*/
bool vector_set ( vector_t * vec , uint32 _t index , const void * elem ) {
bool vector_set ( vector_t * vec , size _t index , const void * elem ) {
if ( ! vec | | index > = vec - > size | | ! elem ) return false ; // 检查vec是否为NULL、索引越界或elem为NULL
void * target = ( void * ) vec - > data + ( index * vec - > elem_size ) ; // 计算目标元素的地址
@@ -122,13 +224,13 @@ bool vector_set(vector_t *vec, uint32_t index, const void *elem){
}
/**
* @brief 获取向量当前元素数 量
* @brief 获取向量容 量
*
* @param vec
* @return size_t
*/
size_t vector_size ( const vector_t * vec ) {
return vec - > size ; // 返回当前元素数量
size_t vector_get_capacity ( const vector_t * vec ) {
return vec - > capacity ; // 返回当前元素数量
}
/**
@@ -137,13 +239,13 @@ size_t vector_size(const vector_t *vec){
* @param vec
* @param new_size
*/
void vector_resize ( vector_t * vec , uint32 _t new_size ) {
if ( ! vec | | new_size < 0 ) return ; // 检查vec是否为NULL或new_size小于0
bool vector_resize ( vector_t * vec , size _t new_size ) {
if ( ! vec ) return false ; // 检查vec是否为NULL或new_size小于0
if ( new_size > vec - > capacity ) {
size_t new_capacity = new_size > vec - > capacity * 2 ? new_size : vec - > capacity * 2 ;
void * new_data = realloc ( vec - > data , new_capacity * vec - > elem_size ) ;
if ( ! new_data ) return ; // 内存分配失败
if ( ! new_data ) return false ; // 内存分配失败
vec - > data = new_data ;
vec - > capacity = new_capacity ;
}
@@ -153,6 +255,7 @@ void vector_resize(vector_t *vec, uint32_t new_size){
}
vec - > size = new_size ; // 更新当前元素数量
return true ; // 成功调整大小
}
/**
@@ -160,11 +263,14 @@ void vector_resize(vector_t *vec, uint32_t new_size){
*
* @param vec
*/
void vector_clear ( vector_t * vec ) {
if ( ! vec ) return ; // 检查vec是否为NULL
bool vector_clear ( vector_t * vec ) {
if ( ! vec ) return false ; // 检查vec是否为NULL
if ( vec - > size = = 0 ) return true ; // 如果向量已经为空,直接返回
vec - > size = 0 ; // 清空向量
memset ( vec - > data , 0 , vec - > capacity * vec - > elem_size ) ; // 可选:将数据区域清零
return true ; // 成功清空向量
}
/**
@@ -172,16 +278,17 @@ void vector_clear(vector_t *vec){
*
* @param vec
*/
void vector_shrink_to_fit ( vector_t * vec ) {
if ( ! vec ) return ; // 检查vec是否为NULL
bool vector_shrink_to_fit ( vector_t * vec ) {
if ( ! vec ) return false ; // 检查vec是否为NULL
if ( vec - > size < vec - > capacity ) {
void * new_data = realloc ( vec - > data , vec - > size * vec - > elem_size ) ;
if ( new_data ) {
vec - > data = new_data ;
vec - > capacity = vec - > size ; // 更新容量为当前元素数量
vec - > capacity = vec - > size ; // 更新容量为当前元素数量b ve
}
}
return true ; // 成功调整内存大小
}
/**
@@ -190,8 +297,8 @@ void vector_shrink_to_fit(vector_t *vec){
* @param vec
* @param new_capacity
*/
void vector_reserve ( vector_t * vec , uint32 _t new_capacity ) {
if ( ! vec | | new_capacity < vec - > size ) return ; // 检查vec是否为NULL或new_capacity小于当前元素数量
bool vector_reserve ( vector_t * vec , size _t new_capacity ) {
if ( ! vec | | new_capacity < vec - > size ) return false ; // 检查vec是否为NULL或new_capacity小于当前元素数量
if ( new_capacity > vec - > capacity ) {
void * new_data = realloc ( vec - > data , new_capacity * vec - > elem_size ) ;
@@ -200,6 +307,7 @@ void vector_reserve(vector_t *vec, uint32_t new_capacity){
vec - > capacity = new_capacity ; // 更新容量
}
}
return true ; // 成功保留数据并扩容
}
/**
* @brief 排序容器中数据
@@ -207,19 +315,24 @@ void vector_reserve(vector_t *vec, uint32_t new_capacity){
* @param vec
* @param compare
*/
void vector_sort ( vector_t * vec , int ( * compare ) ( const void * , const void * ) ) {
if ( ! vec | | ! compare ) return ; // 检查vec是否为NULL或compare函数是否为NULL
bool vector_sort ( vector_t * vec , int ( * compare ) ( const void * , const void * ) ) {
if ( ! vec | | ! compare ) return false ; // 检查vec是否为NULL或compare函数是否为NULL
qsort ( vec - > data , vec - > size , vec - > elem_size , compare ) ; // 使用qsort对数据进行排序
if ( vec - > size = = 0 ) return true ; // 如果容器为空,直接返回
if ( vec - > size = = 1 ) return true ; // 如果容器只有一个元素,直接返回
qsort ( vec - > data , vec - > size , vec - > elem_size , compare ) ; // 使用qsort对数据进行排序
return true ; // 成功排序数据
}
/**
* @brief
* @brief 反转容器中的数据
*
* @param vec
*/
void vector_reverse ( vector_t * vec ) {
if ( ! vec ) return ; // 检查vec是否为NULL
bool vector_reverse ( vector_t * vec ) {
if ( ! vec ) return false ; // 检查vec是否为NULL
if ( vec - > size = = 0 | | vec - > size = = 1 ) return true ; // 如果容器为空或只有一个元素,直接返回
size_t left = 0 ;
size_t right = vec - > size - 1 ;
@@ -241,34 +354,34 @@ void vector_reverse(vector_t *vec){
* @param vec
* @param func 回调函数, 接受一个void指针作为参数
*/
void vector_for_each ( const vector_t * vec , void ( * func ) ( void * ) ) {
if ( ! vec | | ! func ) return ; // 检查vec和func是否为NULL
bool vector_for_each ( const vector_t * vec , void ( * func ) ( void * , size_t index )) {
if ( ! vec | | ! func ) return false ; // 检查vec和func是否为NULL
for ( size_t i = 0 ; i < vec - > size ; i + + ) {
void * elem = ( void * ) vec - > data + ( i * vec - > elem_size ) ;
func ( elem ) ; // 调用函数处理每个元素
func ( elem , i ); // 调用函数处理每个元素
}
}
/**
* @brief 删除第一个 与 elem 匹配的元素(通过 compare 函数判断)。
* @brief 删除与 elem 匹配的元素(通过 compare 函数判断)。
*
* @param vec
* @param elem
* @param compare
*/
void vector_remove ( vector_t * vec , const void * elem , int ( * compare ) ( const void * , const void * ) ) {
if ( ! vec | | ! elem | | ! compare ) return ; // 检查vec、elem和compare函数是否为NULL
bool vector_remove ( vector_t * vec , const void * elem , int ( * compare ) ( const void * , const void * ) ) {
if ( ! vec | | ! elem | | ! compare ) return false ; // 检查vec、elem和compare函数是否为NULL
for ( size_t i = 0 ; i < vec - > size ; i + + ) {
void * current_elem = ( void * ) vec - > data + ( i * vec - > elem_size ) ;
if ( compare ( current_elem , elem ) = = 0 ) { // 如果找到匹配的元素
memmove ( current_elem , ( void * ) current_elem + vec - > elem_size , ( vec - > size - i - 1 ) * vec - > elem_size ) ;
vec - > size - - ; // 减少元素数量
return ; // 找到并删除后退出
}
}
return true ; // 找到并删除后退出
}
/**
@@ -279,17 +392,18 @@ void vector_remove(vector_t *vec, const void *elem, int (*compare)(const void *,
* @param compare
* @param index
*/
void vector_find ( const vector_t * vec , const void * elem , int ( * compare ) ( const void * , const void * ) , uint32 _t * index ) {
if ( ! vec | | ! elem | | ! compare | | ! index ) return ; // 检查参数是否为NULL
bool vector_find ( const vector_t * vec , const void * elem , int ( * compare ) ( const void * , const void * ) , size _t * index ) {
if ( ! vec | | ! elem | | ! compare | | ! index ) return false ; // 检查参数是否为NULL
for ( size_t i = 0 ; i < vec - > size ; i + + ) {
void * current_elem = ( void * ) vec - > data + ( i * vec - > elem_size ) ;
if ( compare ( current_elem , elem ) = = 0 ) { // 如果找到匹配的元素
* index = i ; // 设置索引
return ; // 找到后退出
return true ; // 找到后退出
}
}
* index = - 1 ; // 如果未找到,设置索引为-1
* index = 0 ; // 如果未找到,设置索引为-1
return false ; // 未找到满足条件的元素
}
/**
@@ -299,15 +413,16 @@ void vector_find(const vector_t *vec, const void *elem, int (*compare)(const voi
* @param predicate
* @param index
*/
void vector_find_if ( const vector_t * vec , int ( * predicate ) ( const void * ) , uint32 _t * index ) {
if ( ! vec | | ! predicate | | ! index ) return ; // 检查参数是否为NULL
bool vector_find_if ( const vector_t * vec , int ( * predicate ) ( const void * ) , size _t * index ) {
if ( ! vec | | ! predicate | | ! index ) return false ; // 检查参数是否为NULL
for ( size_t i = 0 ; i < vec - > size ; i + + ) {
void * current_elem = ( void * ) vec - > data + ( i * vec - > elem_size ) ;
if ( predicate ( current_elem ) ) { // 如果满足条件
* index = i ; // 设置索引
return ; // 找到后退出
return true ; // 找到后退出
}
}
* index = - 1 ; // 如果未找到,设置索引为-1
* index = 0 ; // 如果未找到,设置索引为-1
return false ; // 未找到满足条件的元素
}