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; }

我如何申请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_element不对两个分区中的元素进行排序;如果您希望前三个元素按排序顺序,请partial_sort改用。

于 2012-07-22T21:17:33.677 回答
1

std::transform您可以使用,std::multiset和插入迭代器的组合。

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

然后三个最大值是最后三个元素。

于 2012-07-22T20:49:14.047 回答
1

你不能。这不是做什么std::transform

transform将单个函数应用于序列中的每个元素。它不选择特定元素。

于 2012-07-22T20:36:20.603 回答