C++。如何通过保存元素的原始顺序按模块排序

C++. How to sort by module with saving the original order of elements

我正在尝试按模块对向量中的元素进行排序,条件是相等(按模块)元素的初始顺序不变。逻辑告诉我,比较器应该取小于等于来保存原来的顺序。

std::sort(v.begin(), v.end(), [](int a, int b) {
    return abs(a) <= abs(b);
});

但是使用 1 -1 1 -1 我的编译器 return -1 1 -1 1 的示例。不幸的是它保存了小于号的顺序(我不明白为什么)。

确定 std::sort 不是 stalbe,我尝试使用 std::stable_sort 并以 -1 1 1 -1 -1 为例,它按顺序反转元素-1 -1 1 1 -1 - 虽然我预计订单不会因小于或等于的符号而改变。

我哪里错了?是否有保证保留元素顺序的 lambda?

What am I wrong about?

您的程序有未定义的行为,因为 std::sortstd::stable_sort 需要严格的弱顺序,而 <= 不是。重要的是,当您将元素与自身进行比较时,比较必须 return(转换为的值)false.

如果您想要稳定的排序,请使用 std::stable_sort 和有效的 Compare

std::stable_sort(v.begin(), v.end(), [](int a, int b) {
    return abs(a) < abs(b);
});