使用 STL 对部分向量进行排序

Sort partial vector using STL

我有一个指向数组的指针向量,vector<float*> points。该数组的长度为 d。我想将此向量 points[i] 位置排序为 points[j] 位置(包含或不包含,无关紧要,因为我们总是可以相应地调整 1)。此外,我希望它根据第 0 <= x < d 个条目进行排序。我不关心领带是如何解决的(也就是说,没有打破领带或对 (x+1)%dth 条目进行排序——无关紧要)。 C++ 中是否有用于此的函数?我知道我很可能可以通过为此定义我自己的比较器函数来完成 x-th 轴的事情,但是只对向量的一部分进行排序是主要的事情。我没有找到与之相关的任何内容(partial_sort() 接近,但不是我想要的),所以如果之前有人问过这个问题,我很抱歉。任何帮助都会很棒。谢谢...

您可以使用 std::sort 并向其传递您希望排序的迭代器范围,如下所示:

#include <iostream>
#include <algorithm>
#include <vector>

int main() {
    std::vector<int> v{ 2, 4, 1, 6, 5, 7, 2 };

    std::sort(v.begin(), std::min(v.begin() + 3, v.end()));

    for (auto const i : v) {
        std::cout << i << " ";
    }

    return 0;
}

现在输出将是:

1 2 4 6 5 7 2 

所以只有前 3 个元素被排序。

请仔细看看std::min(v.begin() + 3, v.end())。这可以防止你的结局不超过 v.end().

Demo

更新

正如 @Timo 所建议的那样,最好使用 std::next(v.begin(), std::min(static_cast<size_t>(3), v.size())) 而不是 std::min(v.begin() + 3, v.end()),因此完整的代码将是:

#include <iostream>
#include <algorithm>
#include <vector>

int main() {
    std::vector<int> v{ 2, 4, 1, 6, 5, 7, 2 };

    std::sort(v.begin(), std::next(v.begin(), std::min(static_cast<size_t>(3), v.size())));

    for (auto const i : v) {
        std::cout << i << " ";
    }

    return 0;
}

添加到@NutCracker 的答案中:

您可以像这样只对容器的范围进行排序:

std::sort(container.begin() + startIndex, container.begin() + endIndex);

除了@NutCracker 的回答以及是否有人感兴趣,这里有一个使用 Range-v3 的解决方案:

#include <vector>
#include <iostream>

#include <range/v3/action/sort.hpp>
#include <range/v3/view/drop.hpp>
#include <range/v3/view/take.hpp>

int main() {
    using namespace ranges;
    std::vector<int> v{ 2, 4, 1, 6, 5, 7, 2 };
    v | views::drop(1) | views::take(5) | actions::sort;
    std::cout << views::all(v);

    return 0;
}

Demo