首页 > 解决方案 > 在两个范围内按降序对向量进行排序

问题描述

假设我有一个整数向量:

std::vector<int> indices;
for (int i=0; i<15; i++) indices.push_back(i);

然后我按降序排序:

sort(indices.begin(), indices.end(), [](int first, int second) -> bool{return indices[first] > indices[second];})
for (int i=0; i<15; i++) printf("%i\n", indices[i]);

这会产生以下结果:

14
13
12
11
10
9
8
7
6
5
4
3
2
1
0

现在我想将数字 3、4、5 和 6 移到最后,并保持它们的降序(最好不必sort第二次使用)。即,这就是我想要的:

14
13
12
11
10
9
8
7
2
1
0
6
5
4
3

我应该如何修改 的比较功能std::sort来实现呢?

标签: c++sortingc++11vectorstdvector

解决方案


你的比较函数是错误的,因为你得到的值是firstsecond的元素std::vector。因此,没有必要将它们用作索引。所以,你需要改变

return indices[first] > indices[second];

return first > second;

现在,关于你试图解决的问题......

您可以将 3、4、5 和 6 不与其他元素进行比较,但仍然可以相互比较:

std::sort(
    indices.begin(), indices.end(),
    [](int first, int second) -> bool {
        bool first_special = first >= 3 && first <= 6;
        bool second_special = second >= 3 && second <= 6;
        if (first_special != second_special)
            return second_special;
        else
            return first > second;
    }
);

演示


推荐阅读