C ++ std :: sort带有动态数组错误

时间:2013-02-23 00:27:50

标签: c++ arrays sorting

有很多关于如何将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的评论解决。

2 个答案:

答案 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