有很多关于如何将std::sort()
与std::vector
一起使用的示例。对于我的特定家庭作业,我不允许使用std::vector
,因此我想在动态自定义对象数组上使用std::sort()
。
像这样:
int numberOfRoads = 100000;
Road* roads = new Road[numberOfRoads];
// Assume the comparator is defined correctly (<- this was the problem)
std::sort(roads, roads + numberOfRoads, SortRoadsComparator);
这是我收到的主要编译器错误:
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\algorithm(3781): error C2664: 'int (const void *,const void *)' : cannot convert parameter 1 from 'Road' to 'const void *'
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
我收到此错误大约20次。究竟是什么要求我做的?
SortRoadsComparator()
int SortRoadsComparator(void const *v1, void const *v2)
{
Road *a = (Road *)v1;
Road *b = (Road *)v2;
if (a->Length > b->Length)
return 1;
else if (b->Length > a->Length)
return -1;
else
{
// Non-determinism case
if (a->Length == b->Length)
{
if ( (min(a->CityA, a->CityB) < min(b->CityA, b->CityB)) ||
(
(min(a->CityA, a->CityB) == min(b->CityA, b->CityB)) && max(a->CityA, a->CityB) < max(b->CityA, b->CityB)
)
)
{
return -1;
}
else
{
return 1;
}
}
else
{
// Not expecting this
}
}
}
由billz的评论解决。
答案 0 :(得分:3)
它要求您将适当的比较器传递给std :: sort。如果您阅读std :: sort documentation,您可以看到它需要以下签名:
bool cmp(const Type1 &a, const Type2 &b);
和:
类型Type1和Type2必须使得RandomIt类型的对象可以被解除引用,然后隐式转换为它们。
因此,在您的情况下,取消引用的“迭代器”道路类型为Road&amp;和功能可能是这样的:
bool cmp( const Road &a, const Road &b );
PS看起来你正在将qsort代码移植到C ++中。虽然建议签名:
int cmp( const Road &a, const Road &b );
将编译,它在逻辑上是不正确的,并且会隐藏您需要更改函数中的返回值并略微更改逻辑的事实。在当前的实现中,std :: sort很可能会崩溃,但是definatelly不会按照你期望的方式对你的序列进行排序。
答案 1 :(得分:2)
SortRoadsComparator
函数原型应该是:
bool SortRoadsComparator(Road const& v1, Road const& v2);
您应确保SortRoadsComparator
返回弱有序Road
。