2

有很多关于如何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 次。它究竟需要我做什么?

排序道路比较器()

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 的评论解决。

4

2 回答 2

3

它要求您将适当的比较器传递给 std::sort。如果您阅读 std::sort文档,您会发现它需要以下签名:

bool cmp(const Type1 &a, const Type2 &b);

和:

类型 Type1 和 Type2 必须使得 RandomIt 类型的对象可以被取消引用,然后隐式转换为它们。

因此,在您的情况下,取消引用的“迭代器”道路具有 Road& 类型,并且功能可能类似于:

bool cmp( const Road &a, const Road &b );

PS 看起来您正在将 qsort 代码移植到 C++ 中。虽然建议签名:

int cmp( const Road &a, const Road &b );

将编译,它在逻辑上是不正确的,并且会隐藏您需要更改函数中的返回值并稍微更改逻辑的事实。在当前的实现中,std::sort 很可能会崩溃,但肯定不会按照您期望的方式对您的序列进行排序。

于 2013-02-23T00:41:26.240 回答
2

SortRoadsComparator函数原型应该是:

bool SortRoadsComparator(Road const& v1, Road const& v2);

您应该确保SortRoadsComparator返回弱有序Road

于 2013-02-23T00:37:28.967 回答