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回発生します。正確には何をする必要がありますか?

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
        }
    }
}

ビルズのコメントで解決。

4

2 に答える 2

3

適切なコンパレータをstd::sortに渡す必要があります。std :: sortのドキュメントを読むと、次の署名が必要であることがわかります。

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

と:

タイプ1とタイプ2は、タイプRandomItのオブジェクトを逆参照して、暗黙的に両方に変換できるようなものでなければなりません。

したがって、あなたの場合、参照解除された「イテレータ」道路のタイプはRoad&であり、関数は次のようになります。

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

PSqsortコードを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 に答える