【问题标题】:Comparing voids in c++比较 C++ 中的空洞
【发布时间】:2012-10-14 01:58:23
【问题描述】:

尝试比较排序算法的空位。到目前为止我有这个,但如果你把它们转换成整数,它有点违背了 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;
}

【问题讨论】:

  • “比较空隙”是什么意思? Void 基本上什么都不是——在void * 中,表示特定类型的absence——那么C++ 怎么知道要比较什么?
  • void 是一个不完整的类型,因此您不能取消引用 void *。因此,没有办法比较空位。由于这是标记为 C++,您不应该使用std::sort。模板可以让你避免这种void * 丑陋。
  • @Praetorian:+1 用于提及模板。我正要这样做,但是。 :) 听起来这是一个编程练习,不过……所以重新发明像 std::sort 这样的东西是其中的一部分也就不足为奇了。
  • 短语“我的教授”表明这是来自编程课,可能是关于使用旧技术来演示程序员可能会遇到的特定技术,尤其是在维护旧源代码时。这是一个完全合理的问题。

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


【解决方案1】:

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

由于qsort 不关心返回值是1-1 并且可以采用任何正数或负数,所以这个版本甚至更短,但同样适用于qsort

int fcmp (const void * one, const void * two)
{
    return ( *(int*)one - *(int*)two );
}

qsort 之所以使用void*,是为了让你对不同的数据类型使用相同的算法。

【讨论】:

  • 如果one 是正数,而two 是负数,你可以使用你的快捷方式溢出,并调用UB。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    这看起来是在几个标准库函数(如 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 2021-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      相关资源
      最近更新 更多