1

C++ でリストの並べ替えを正しく実装する方法がわかりません。ビルド エラーが発生します。

'Ranker::compare': 関数呼び出しに引数リストがありません。'&Ranker::compare'メンバーへのポインタを作成するために使用します

リストのソート機能を正しく実装するにはどうすればよいですか?

ランカー.h:

list<Competitor*> sorted;

ランカー.cpp:

bool Ranker::compare(Competitor* first, Competitor* second) {
    if (first->getTime() < second->getTime())
        return true;
    else
        return false;
}

int Ranker::addList(Competitor* starter) {
    sorted.push_back(starter);
    sorted.sort(compare);
}
4

3 に答える 3

7

rankor を単純なファンクタにするだけです:

struct Compare
{
    bool operator()(Competitor* first, Competitor* second) const {
        return first->getTime() < second->getTime();
    }
};

// STUFF
sorted.sort(Compare());

または、C++11 を使用している場合

sorted.sort([](Competitor* first, Competitor* second) {
          return first->getTime() < second->getTime();
           });
于 2013-11-05T23:25:51.017 に答える
5

Ranker::compare()メンバー関数です。メンバー関数はインスタンスに関連付けられています。静的メソッドまたは「無料」関数のいずれかを使用してみてください。

于 2013-11-05T23:25:42.530 に答える
0

この関数には、Ranker::compare()実際には3 つの引数があります。2 つのCompetitorオブジェクトに加えて、オブジェクトへの暗黙的なポインターもパラメーターとして取ります。ただし、do に渡される二項述語std::list<...>::sort()は 2 つのパラメーターしか取りません。

最も簡単な修正は、おそらく関数をstaticメンバーにすることです。ただし、関数ポインターがインライン化されることはめったにないため、これがおそらく最速のアプローチではないというわけではありません。関数呼び出しのオーバーヘッドを減らしたい場合は、ロジックを適切な関数オブジェクトにカプセル化することをお勧めします。

struct RankerCompare {
    bool operator()(Competitor const* first, Competitor const* second) const {
        return first->getTime() < second->getTime();
    }
};
...
sorted.sort(RankerCompare());

trueところで、ブール値は、条件ステートメントを返すことによって、または条件文からよりブール値になることはありませんfalse! ブール値を直接返すことはまったく問題ありません!

于 2013-11-05T23:29:34.110 に答える