我正在尝试使用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;
}
我有一些错误的地方......
答案 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
与指针数组一起使用。