4

次の問題を解決するコードを書いています: 一連の数値x[0], x[1], ...,が与えられた場合x[N-1]、それらを昇順に並べ替える順列を見つけます。言い換えれば、{0,2,...,N-1} の順列を 、 、 ... のように見つけたいと考えi[0]i[1]i[N-1]ますx[i[0]] <= x[i[1]] <= ... <= x[i[N-1]]

このために、xベクトルとインデックス ベクトルi(最初は で埋められているi[j] = j) をクラスのプライベート メンバーとして格納しました。また、プライベートメソッドを次のように定義しました

bool MyClass::compare(size_t s, size_t t) {
    return (x[s] < x[t]);
}

今、私は次のように呼び出しstd::sortます

std::sort(i.begin(), i.end(), compare);

そして、私は望ましい結果が得られることを期待しています。しかし、コードはコンパイルされず、次のエラーが発生します。

error: no matching function for call to ‘sort(std::vector<long unsigned int>::iterator, std::vector<long unsigned int>::iterator, <unresolved overloaded function type>)’

std::sort比較演算子として関数を渡すことができるという言及のドキュメントと同様に、すべてを正しく行ったに違いありませんstd::sort( http://www.cplusplus.com/reference/algorithm/sort/ )

事前にご協力いただきありがとうございます。

4

4 に答える 4

9

あなたのアプローチにはいくつかの問題があります。最初の最も明白な点は、メンバー関数をフリー関数として使用できないことです。呼び出すcompareには、型のオブジェクトMyClassと 2 つの整数が必要です。実装の内部では、2 つの整数引数のみでフリー(非メンバー) 関数std::sortを呼び出そうとします。

それ以外では、明示的にアドレスを取得しないと、メンバー関数へのポインターを作成できません。行std::sort(..., compare);はメンバー関数に対してコンパイルされません。非メンバー関数は自動的に関数へのポインターに減衰しますが、ここではそうではありません。

C++11 には、2 つの異なる解決策があります。this最も一般的なのは、引数を取得するラムダを作成することです。

std::sort(std::begin(i),std::end(i),
          [](int x, int y) { return compare(x,y); }); // or maybe even implement here

別のアプローチは、オブジェクトとメンバー関数をファンクターにバインドすることです。

std::sort(std::begin(i),std::end(i),
          std::bind(&MyClass::compare,this,_1,_2));

この最後のケースでは、関数は2 つの引数を取るstd::bindことを実装するオブジェクトを作成し、 が指すオブジェクトのメンバー関数を呼び出します。operator()MyClass::comparethis

両方のアプローチのセマンティクスはわずかに異なりますが、この場合はどちらを使用してもかまいません。

于 2013-08-16T13:15:04.040 に答える
0

@dribeasの答えがうまくいかなかったとコメントしたいだけです。私はラムダ関数を使用していますが、編集する必要がありました:

 std::sort(MyVector.begin(), MyVector.end(),
      [this](int x, int y) { return compare(x,y); });
于 2014-06-02T20:34:55.650 に答える
0

この問題を回避する 1 つの方法は、クラスで関数呼び出し演算子を定義することです (こちらを参照)。

bool MyClass::operator() (size_t s, size_t t) {
    return (x[s] < x[t]);
}

次に、次のように sort() メソッドを呼び出すことができます。

sort(i.begin(), i.end(), *this);
于 2013-08-16T13:15:21.590 に答える