c++ - 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_sort
and with 和-1 1 1 -1 -1
它的示例按顺序颠倒了元素-1 -1 1 1 -1
- 尽管我预计顺序不会随着符号小于或等于而改变。
我错了什么?是否有保证保留元素顺序的 lambda?
解决方案
我错了什么?
您的程序具有未定义的行为,因为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);
});
推荐阅读
- mysql - 来自 Innodb 中 MySQL 的奇怪 JOIN 解释
- r - R中的ECM和ARDL模型
- php - 未捕获的 phpmailerException:无法实例化邮件功能
- ionic-framework - 在面向 Web 平台的 ionic 3 应用程序中集成推送通知时面临的问题
- javascript - 如何使用 querySelector 将数据传递到 DOM
- c# - context.MyContext.SqlQuery() 从上下文的 OnModelCreating() 中跳过映射逻辑?
- azure-devops - Azure Devops - 在发布管道任务中访问工件源
- angular - Ag-Grid 编辑数据并发送到服务器
- python - 基于另一个模型外键填充表单字段
- 姜戈 - scala - scala 从 REST 服务获取响应