选择最大“n”值

时间:2012-07-22 20:34:02

标签: c++ algorithm vector

如果我有以下内容:

#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()查找第一个三个 最大值

感谢。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

你做不到。这不是std::transform所做的。

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

答案 2 :(得分:1)

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

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

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