2

並べ替え関数を使用して、2 番目の値を比較するペアを含むリストを並べ替えようとしています。これは私が使用しているものです:

std::sort(score_list.begin(), score_list.end(), compare_pair);

これはソート機能です:

bool Highscore::compare_pair (std::pair<std::string, int> first, std::pair<std::string, int> second)

{
  if (first.second<second.second) return true;
  else return false;
}

そして、私はこのエラーメッセージを受け取っています:

error: no matching function for call to ‘sort(std::list<std::pair<std::basic_string<char>, int> >::iterator, std::list<std::pair<std::basic_string<char>, int> >::iterator, <unresolved overloaded function type>)’

何かアドバイス?ありがとう

4

3 に答える 3

3

メンバー関数をコンパレータとして直接渡すことはできません。関数を使用する場合、実際に渡されるのは関数へのポインターですが、関数へのポインターは、メンバー関数へのポインターとはまったく異なります。

C ++ 98/03には、名前が付けられたいくつかのアダプターがmem_funあり、mem_fun_refそれはこれに対処します。

C ++ 11は、およびを追加mem_fnおよび非推奨mem_funにしmem_fun_refます。あなたがそれを含めるのに十分新しいコンパイラを持っていると仮定すると、それはかなり使いやすいです。

ただし、コンパイラがそれほど新しい場合は、ラムダも含まれている可能性があります。これにより、比較を処理する関数オブジェクトの「インプレース」定義を使用できるため、タスクが大幅にクリーンになります。

typedef std::pair<std::string, int> data_t;

std::sort(score_list.begin(), score_list.end(),
    [](data_t const &a, data_t const &b) { 
        return a.second < b.second; 
    });

「C++11ラムダ」のようなものをグーグルで検索した場合、これに関するかなり多くの情報を見つける必要があります(その多くはほぼ確実にここに直接戻ってきます)。

于 2012-12-13T02:39:27.953 に答える
2

また、ほぼ確実に、値ではなくconst参照によってペアをsort関数に渡したいと思うでしょう。

static bool Highscore::compare_pair (const std::pair<std::string, int> &first, const std::pair<std::string, int> &second)

そしてtypedefあなたの友達です。

于 2012-12-13T02:39:33.920 に答える
1

並べ替える場合は、メンバー関数std::listを使用する必要があります。std::list::sortこのstd::sortアルゴリズムはランダム アクセス イテレータを必要とし、双方向イテレータstd::listのみを提供します。

于 2012-12-13T03:18:48.790 に答える