【发布时间】:2021-01-10 16:40:28
【问题描述】:
有人能解释一下为什么 main 中的 2 last sort 函数不起作用,而第一个函数可以正常工作。
程序构建没有错误。代码如下:
#include <iostream>
#include <vector>
#include <math.h>
#include <algorithm>
using namespace std;
bool comp (int a, int b) {
if (a % 2 == 0) { return 1; }
else { return 0; }
}
int main() {
int n; cin >> n;
int arr[n];
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
sort(arr, arr+n, comp);
int pos;
for (int i = 0; i < n; i++) {
if (arr[i] % 2 == 1) {
pos = i;
break;
}
}
vector<int> un_sorted;
for (int i = 0; i < n; i++)
{
un_sorted.push_back(arr[i]);
}
//7
//5 9 2 8 6 4 7
//4 6 8 2 5 9 7
sort(un_sorted.begin(), un_sorted.begin()+pos-1);
sort(un_sorted.begin()+pos, un_sorted.end(), greater<int>());
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
}
我试图将一个数组分成两部分:赔率和偶数,然后偶数按升序排序,赔率按降序排序
【问题讨论】:
-
你的函数不符合
std::sort比较器的要求 -
std::partition是您将序列分成两部分的方式。sort(arr, arr+n,comp)表现出未定义的行为,因为comp不满足严格的弱排序要求。 -
@AlanBirtles:您的评论是有效的,但我不会将此问题标记为欺骗。
-
作为欺骗链接的具体示例,
comp(4, 4)说 4 应该在 4 之前。它还说 2 应该在comp(2, 4)中的 4 之前,但 4 应该在 @987654328 中的 2 之前@. -
@einpoklum 程序的行为是未定义的,问题只会在以后发生并不奇怪,一些
std::sort实现会使用无效的比较器超出容器的范围
标签: c++ sorting comparison