比较c ++中的空洞

时间:2012-10-24 02:40:20

标签: c++ pointers comparison void void-pointers

尝试比较排序算法的空洞。到目前为止我有这个,但如果你把它们投入到整体中,它有点击败IMO的目的。有没有办法比较空洞?我的教授没时间了,怎么被卡在网络上。任何帮助表示赞赏。感谢

int fcmp(const void *one, const void *two)
{
    if (*(int*)one > *(int*)two) return 1;
    if (*(int*)one < *(int*)two) return -1;
    return 0;
}

3 个答案:

答案 0 :(得分:2)

假设想法是在qsort的上下文中使用fcmp,那么您的代码完全有效。

由于qsort并不关心返回的值是1还是-1,并且会接受任何正数或负数,因此此版本更短,但可以使用{{ 1}}同样:

qsort

int fcmp (const void * one, const void * two) { return ( *(int*)one - *(int*)two ); } 使用qsort的原因是让您使用不同数据类型的相同算法。

答案 1 :(得分:2)

您不是在比较此代码中的“空白”。代码将void指针转换为int指针,然后取消引用结果,这意味着您要比较指针所指向的int。理想情况下,函数可以这样写:

int fcmp(const int *one, const int *two)
{
    if (*one > *two) return 1;
    if (*one < *two) return -1;
    return 0;
}

但它不是那样写的,因为在这种情况下fcmp()需要有一个特定的签名。否则,它不能以通用方式使用。作为对另一个函数的回调,例如。

答案 2 :(得分:1)

这看起来是一个标准的比较函数,用于几个标准库函数,比如qsort(),你可以用某种数据项数组调用函数,同时比较函数指示两个元素是否等于每个或不然,如果不是他们的整理顺序。

所以void指针指向的是程序员。这是在比较函数接口中使用void指针的目的,因为调用比较函数的函数(如qsort())只想知道两个数组元素的顺序。它不知道是什么数组元素是或如何进行比较,它只知道数组的起始地址和每个元素的大小以及有多少元素。

标准库中的另一个功能是bsearch() function

所以要使用它,你可能会有以下代码: 见qsort() man page

typedef struct {
   int iValue;
   char  sName[10];
} DataValue;

// compare two elements of the array and indicate which one is higher
// or lower in collating sequence or if they are equal.
int dataComp (void *one, void *two)
{
    return ((DataValue *)one)->iValue - ((DataValue *)two)->iValue;
}

int main (int argc, char *argv[])
{
    DataValue myData[25];
   //.. put some data stuff in the array.
   // call qsort with the array.  specify number of elements and size of each one
   qsort (myData, sizeof(myData)/sizeof(myData[0]), sizeof(myData[0]), dataComp);
}