c++是否有一个内置的partial_sort返回排序值的位置

4smxwvx5  于 2022-12-27  发布在  其他
关注(0)|答案(1)|浏览(115)

我有一个N个元素的列表,我想找到最小(或最大)M个值的***位置***,是否有内置函数(沿着于std::sort或std::partial_sort)可以实现这一点?

f87krz0w

f87krz0w1#

没有内置函数,但您可以尝试类似这样的操作:

  • 在原始数组中创建一个迭代器向量,这比〈index,value〉对向量占用的空间要少得多,并且可以最快地访问原始数据,这是nth_element()尽可能高效运行所必需的。
  • 在向量上调用std::nth_element()。
  • 通过调用std::distance(或使用减法,对于c ++98)获取索引。

例如:

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

相关问题