我有一个N个元素的列表,我想找到最小(或最大)M个值的***位置***,是否有内置函数(沿着于std::sort或std::partial_sort)可以实现这一点?
f87krz0w1#
没有内置函数,但您可以尝试类似这样的操作:
例如:
template <typename Fn> std::vector<size_t> GetMElementsPositions(const std::vector<int>& v, size_t m, Fn&& compare) { assert(m != 0); assert(m <= v.size()); std::vector<std::vector<int>::const_iterator> w; w.reserve(v.size()); for (auto i = v.begin(); i != v.end(); ++i) w.push_back(i); std::nth_element(w.begin(), w.begin() + M - 1, w.end(), [&compare](auto& x, auto& y) { return compare(*x, *y); }); std::vector<size_t> r; r.reserve(M); for (auto i = w.begin(); i != w.begin() + M; ++i) r.push_back(std::distance(v.begin(), *i)); return r; }
你也可以跳过std::distance()à部分,把结果裁剪到一定大小(或者如果M比原始数据集小很多,就复制到一个更小的数组中)。使用迭代器和使用指针一样简单,而且比使用索引更高效。您将在此处找到一个工作原型:https://godbolt.org/z/YjjoanoTb
1条答案
按热度按时间f87krz0w1#
没有内置函数,但您可以尝试类似这样的操作:
例如:
你也可以跳过std::distance()à部分,把结果裁剪到一定大小(或者如果M比原始数据集小很多,就复制到一个更小的数组中)。使用迭代器和使用指针一样简单,而且比使用索引更高效。
您将在此处找到一个工作原型:https://godbolt.org/z/YjjoanoTb