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::sort
和 std::stable_sort
需要严格的弱顺序,而 <=
不是。重要的是,当您将元素与自身进行比较时,比较必须 return(转换为的值)false
.
如果您想要稳定的排序,请使用 std::stable_sort
和有效的 Compare
std::stable_sort(v.begin(), v.end(), [](int a, int b) {
return abs(a) < abs(b);
});
我正在尝试按模块对向量中的元素进行排序,条件是相等(按模块)元素的初始顺序不变。逻辑告诉我,比较器应该取小于等于来保存原来的顺序。
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::sort
和 std::stable_sort
需要严格的弱顺序,而 <=
不是。重要的是,当您将元素与自身进行比较时,比较必须 return(转换为的值)false
.
如果您想要稳定的排序,请使用 std::stable_sort
和有效的 Compare
std::stable_sort(v.begin(), v.end(), [](int a, int b) {
return abs(a) < abs(b);
});