是否可以将类的对象转换为void *?

时间:2010-05-26 12:10:57

标签: c++ stl qsort

我正在尝试使用STL中的qsort来排序边缘数组:

struct edge
{
    int w,v,weight;
};

按重量计算。我在想的是:

int compare_e(const void *a, const void *b)
{
    return ( *(edge *)a->weight - *(edge *)b->weight );
};

但我明白了:

  

`const void *'不是   指向对象类型

编辑: 好的,现在我的代码已编译但排序似乎不能100%工作......

#include <cstdlib>
#include <iostream>


struct edge
{
    int w,v,weight;
};

struct edge_ID:edge
{
    int id;
};

int compare_e(const void *a, const void *b)
{
    return ( ((edge *)a)->weight > ((edge *)b)->weight );
};

int main()
{   
    using namespace std;

    edge *tab = new edge[100];

    for(int i = 0; i < 100; i++)
    {
        tab[i].weight = rand() % 100;
        cout << i << " => " << tab[i].weight << endl;
    }


    qsort(tab, 100, sizeof(edge), compare_e);

    cout << "AFTER:" << endl;
    for(int i = 0; i < 100; i++)
    {
        cout << i << " => " << tab[i].weight << endl;
    }


    system("PAUSE");
    return EXIT_SUCCESS;
}

我有一些错误的地方......

6 个答案:

答案 0 :(得分:3)

你可以这样做:

int compare_e(const void *a, const void *b)
{
    return  ((edge *)a)->weight - ((edge *)b)->weight ;
}

但如果您正在编写C ++代码,我看不出有任何理由这样做 - 为什么需要使用这个compare_e函数?

答案 1 :(得分:3)

您需要((const edge *)a)->weight - ((const edge *)b)->weight

答案 2 :(得分:3)

不要使用qsort,请使用std :: sort:http://www.sgi.com/tech/stl/sort.html

答案 3 :(得分:2)

您需要一个额外的括号,不应该使用*

取消引用指针
((edge *)a)->weight

要回答您的问题,您的compare_e功能现已错误!保留第一个减去两个权重的版本。

比较函数应返回负数A < B,如果A == B则返回0,如果A > B则返回正数。您可以使用if/else来实现它,但在大多数情况下return A - B都有效。

答案 4 :(得分:2)

struct less_by_weight
{
  bool operator()(const edge& lhs, const edge& rhs) const
  {
    return lhs.weight < rhs.weight;
  }
};

int main()
{   
    const std::size_t size = 100;
    edge *tab = new edge[size];

    for(int i = 0; i < size; ++i)
    {
        tab[i].weight = rand() % size;
        std::cout << i << " => " << tab[i].weight << '\n';
    }

    std::sort( tab, tab+size, less_by_weight() ); 

    std::cout << "AFTER:" << '\n';
    for(int i = 0; i < size; ++i)
    {
        std::cout << i << " => " << tab[i].weight << '\n';
    }

    return EXIT_SUCCESS;
}

答案 5 :(得分:2)

在回答您的问题时,无法将对象强制转换为void*。指针可以转换为void*,但不能转换为对象。引用也可以转换为void*

qsort不是C ++标准模板库的一部分,它是标准 C 库的一部分,这是完全不同的。

STL绝对是惯用C ++的方法。 @ sbi的答案向您展示了如何将std::sort与指针数组一起使用。