首页 > 解决方案 > C++。如何按模块排序并保存元素的原始顺序

问题描述

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

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_sortand with 和-1 1 1 -1 -1它的示例按顺序颠倒了元素-1 -1 1 1 -1- 尽管我预计顺序不会随着符号小于或等于而改变。

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

标签: c++sortingcomparatorstable-sort

解决方案


我错了什么?

您的程序具有未定义的行为,因为std::sort并且std::stable_sort需要严格的弱顺序,而<=事实并非如此。重要的是,当您将元素与其自身进行比较时,比较必须返回(转换为的值)false

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

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

推荐阅读