2

私はこの機能を持っています

std::vector <std::vector <int> > puddles;
std::set <int> is_checked;

size_t M, N;

bool v_compare(int a, int b){
    return puddles[(a-a%M)/M][a%M] < puddles[(b-b%M)/M][b%M];
}

そして、の最小値に対応するセット要素を見つけたいpuddles(私i*M+jはセットのキーとして使用します)。だから私は自分の関数をの述語として使おうとしていますmin_element

close(*std::min_element(is_checked.begin(), is_checked.end(), v_compare));

しかし、私はこのエラーが発生しました

:113:82: error: no matching function for call to 'min_element(std::set<int>::iterator, std::set<int>::iterator, <unresolved overloaded function type>)'
:113:82: note: candidates are:
/usr/include/c++/4.6/bits/stl_algo.h:6173:5: note: template<class _FIter> _FIter std::min_element(_FIter, _FIter)
/usr/include/c++/4.6/bits/stl_algo.h:6201:5: note: _FIter std::min_element(_FIter, _FIter, _Compare) [with _FIter = std::_Rb_tree_const_iterator<int>, _Compare = bool (TFlood::*)(int, int)]
/usr/include/c++/4.6/bits/stl_algo.h:6201:5: note:   no known conversion for argument 3 from '<unresolved overloaded function type>' to 'bool (TFlood::*)(int, int)'
4

1 に答える 1

1

関数へのポインターとメンバー関数へのポインターには違いがあります。ないクラスメンバーはstatic、メンバー関数へのポインターを取得します。ただしstd::min_element、関数または他の呼び出し可能な型へのポインターのみを受け入れ、メンバー関数へのポインターは、ポインターまたはクラス・オブジェクトへの参照なしでは呼び出すことができないため、修飾されません。そして、あなたが見つけたように、関数をstaticメンバーにしようとすると、それはメンバーに到達できませんM。(多分puddles、それもメンバーなら。)

ラムダをサポートするg++4.6を使用しているようです。したがって、最も簡単な解決策は次のとおりです。

close(*std::min_element(is_checked.begin(), is_checked.end(),
      [this](int a, int b) { return puddles[a/M][a%M] < puddles[b/M][b%M]; }));

(整数型の除算(a-(a%M))/Mは常にゼロに向かって丸められるため、減算を取り除きました。したがって、常に同じ結果になります。)コンパイラフラグa/Mを使用していることを確認してください。ラムダマジックは、後で比較オブジェクトで使用するためにポインターを-std=c++0x「キャプチャ」します。this

于 2013-03-11T15:57:16.883 に答える