【问题标题】:C++. How to sort by module with saving the original order of elementsC++。如何按模块排序并保存元素的原始顺序
【发布时间】:2021-11-04 22:59:23
【问题描述】:

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

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

但是以1 -1 1 -1 为例,我的编译器返回-1 1 -1 1。不幸的是,它用小于号保存了订单(我不明白为什么)。

决定 std::sort 不是 stalbe,我尝试使用 std::stable_sort-1 1 1 -1 -1 的示例,它按顺序颠倒了元素 -1 -1 1 1 -1 - 虽然我预计订单会不以小于或等于的符号改变。

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

【问题讨论】:

标签: c++ sorting comparator stable-sort


【解决方案1】:

我错在哪里?

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 2012-03-16
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多