如果我有以下内容:
#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()
查找第一个三个 最大值?
感谢。
答案 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::transform
,std::multiset
和插入迭代器的组合。
vector<Features> v;
...fill it up
multiset<int> ms;
transform(v.begin(), v.end(), inserter(ms, ms.begin()), criterionFunction);
然后三个最大值是最后三个元素。