C++ 选择最大“n”值

C++ 选择最大“n”值,c++,algorithm,vector,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*fea

如果我有以下资料:

#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; }
如何应用转换来查找前三个最大值

谢谢。

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

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

您不能。这不是std::transform所做的

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

通过std::transform、std::multiset和插入迭代器的组合,您可以选择

vector<Features> v;
...fill it up
multiset<int> ms;
transform(v.begin(), v.end(), inserter(ms, ms.begin()), criterionFunction);
然后,三个最大值是最后三个元素。

通过std::transform、std::multiset和插入迭代器的组合,您可以

vector<Features> v;
...fill it up
multiset<int> ms;
transform(v.begin(), v.end(), inserter(ms, ms.begin()), criterionFunction);
然后,三个最大值是最后三个元素。

下面是一个示例,使用第n个元素和一个更简单的特征对象和标准函数来减少混乱:

#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的结果可能会很有用,以防止重复调用

注意,n_元素不会对两个分区中的元素进行排序;如果您希望前三个元素按排序顺序排列,请改用部分排序。

下面是一个示例,使用第n个元素和更简单的特征对象和标准函数来减少混乱:

#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的结果可能会很有用,以防止重复调用


注意,n_元素不会对两个分区中的元素进行排序;如果希望前三个元素按排序顺序排列,请改用部分排序。

为什么要变换?第n个元素或部分排序似乎更合适。请更具体一些。这可能是一个线性优化问题,或者您只想从现有列表中选择一些元素。为什么要转换?第n个元素或部分排序似乎更合适。请更具体一些。这可能是一个线性优化问题,或者您只是想从现有列表中选择一些元素。请注意,第n个元素不会按顺序生成3项。部分排序可以做到这一点。@sehe OP没有要求对它们进行排序:不过我添加了一条备注。请注意,第n_元素不会导致按顺序排列的3项。部分排序就可以了。@sehe OP并没有要求订购它们:不过我要加一句话。