为非排序通用数组创建通用搜索功能

时间:2012-01-28 15:20:07

标签: c generics search vector

我正在使用C语言中的函数和数据结构创建我的个人通用库。

我有一个通用的载体

typedef struct vector
{
  int max;
  int size;
  void **data;
} vector_t;

我为vector创建了函数:

int vector_new( vector_t * v, int vecsize );
int vector_add( vector_t *v , void *elem );
int vector_remove( vector_t * v, void *elem);
void vector_free( vector_t *v );

删除函数的实现中,当且仅当元素尚未存在于数据数组中时,才添加元素。 我创建了一个函数 search (因为我不想对我插入的元素进行排序)以查找可能的重复项。

好吧,我对我必须传递给函数的第一个参数的类型有疑问。我想创建函数 search 不仅仅是为了这个用途,而是一般。

在remove()中,我这样调用它:search(v->data, elem);, 但该功能的原型将如何?

int search( ??? , void * e );

我知道第一个参数可能是一个数组。但我不知道例如void*void** 重要的是,这个函数不仅适用于我创建的结构和函数。

2 个答案:

答案 0 :(得分:1)

听起来你需要定义一个函数指针,用于比较向量中的元素是否相等。然后可以将其作为参数添加到搜索方法

typedef bool (*vector_equals)(void* pLeft, void* pRight);
int vector_search(vector_t* v, vector_equals callback);

现在假设我有一个包含int值的向量。我可以将回调定义为

bool vector_int_equals(void* left, void* right) {
  int* intLeft = left;
  int* intRight = right;
  return *left == * right;
}

答案 1 :(得分:0)

我会做int search(void **array, unsigned int size, void *data); 这是因为你总是在一个指针数组中搜索(与什么无关),因此void *的数组看起来是正确的。

您可能还想考虑比较是做什么的。如果它是指针之间的简单==,那很简单。但如果你需要别的东西,可能会更复杂。