1

私が以下を持っている場合:

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

    struct Features{ int F1, F2, F3, F4; };

    int criterionFunction(Features const& features) {
        return
            -2*features.F1*features.F2
            +3*features.F1
            +5*features.F2
            -2*features.F1*features.F2*features.F3
            +7*features.F3
            +4*features.F4
            -2*features.F1*features.F2*features.F3*features.F4; }

最初の3つの最大値transform()を見つけるにはどうすればよいですか?

ありがとう。

4

3 に答える 3

2

nth_elementこれは、より単純な機能オブジェクトと基準関数を使用した例です (混乱を減らすため):

#include <algorithm>
#include <vector>
#include <iterator>
#include <iostream>

typedef int Features;

int criterionFunction(Features features) {
  return features;
}

int main() {
  std::vector<Features> v { 0, 4, 2, 5, 4, 3, -2, 1 };
  std::nth_element(v.begin(), v.begin() + 3, v.end(),
                   [](Features a, Features b) {
                       return criterionFunction(a) > criterionFunction(b);
                   });
  std::copy(v.begin(), v.begin() + 3,
            std::ostream_iterator<Features>(std::cout, " "));
}

元のオブジェクトの場合、呼び出しの重複を防ぐためFeaturesに、結果をキャッシュ/メモ化すると便利な場合があります。criterionFunction

nth_element2 つのパーティションの要素を並べ替えないことに注意してください。最初の 3 つの要素を並べ替えたい場合は、partial_sort代わりに を使用します。

于 2012-07-22T21:17:33.677 に答える
1

できません。それは何でstd::transformはありません。

transformシーケンス内のすべての要素に単一の関数を適用します。特定の要素を選択するわけではありません。

于 2012-07-22T20:36:20.603 に答える
1

std::transformstd::multiset、および挿入イテレータの組み合わせで可能です。

vector<Features> v;
...fill it up
multiset<int> ms;
transform(v.begin(), v.end(), inserter(ms, ms.begin()), criterionFunction);

次に、3 つの最大値は最後の 3 つの要素です。

于 2012-07-22T20:49:14.047 に答える