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并没有要求订购它们:不过我要加一句话。