在 std::sort() 中的自定义函数中,>(大于)运算符与 <(小于运算符)的交换会导致分段错误吗?
In a custom function in std::sort() the interchanging of >(greater than) operator to <(less than operator) can cause segmentation fault?
我正在尝试实现kruskal的mst算法。我试图根据每条边权重的递增顺序对向量边中的边进行排序。但在对完整向量进行排序后,出现了分割错误。但是如果我改变<(小于)符号到>(大于)在我的mycomp函数中,这样它将按降序排序,它正在正确执行。为什么会这样?我认为这里保持了严格的弱排序。谢谢你。
#include<algorithm>
#include<iostream>
#include<vector>
#define all(container) container.begin(),container.end()
bool mycomp(const Edge* a,const Edge* b)
{return a->weight<b->weight;}
void kruskalmst(Graph* graph)
{vector<Edge*> result;int i=0;
sort(all(graph->edge),mycomp);
}
for循环的条件:
i<graph->e,result.size()<graph->v-1
使用逗号操作符。根据ISO标准5.18 pt.1:"用逗号分隔的一对表达式从左到右求值;左边的表达式是一个被丢弃的值表达式"。
这意味着你循环,不考虑如果i<graph->e
,所以你可以超越你的迭代器的结束。
是的,要解决这个问题,您还需要用逻辑运算符替换逗号。若graph->e
为边数,则连接器应为&&
。
相关文章:
- 交换运算符 + 重载会导致无限递归
- C++ - 没有自定义交换功能的移动分配运算符?
- 为什么基类中的复制和交换会导致派生类中的复制赋值运算符被隐式删除?
- 为什么标准在移动分配运算符中使用交换?
- 运算符重载的隐式交换性
- 如何为模板嵌套类编写可交换的重载算术运算符?
- &&&运算符的交换性质问题
- 如何在没有复制赋值运算符的情况下交换两个对象
- 如何重载加法运算符以进行交换计算
- 运算符+=可以调用自己,但"*this"与"rhs"交换吗?
- 是具有复制和交换习惯用法的复制赋值运算符,建议进行自赋值检查
- 交换与使用std::map[]运算符赋值(const问题)
- 异或交换算法中运算符的未定义行为
- 原子比较运算符(无交换)
- 为什么内存泄漏只发生在赋值运算符重载的情况下,而不是在复制构造函数中,以及复制和交换习惯用法如何解决它
- 通过 xor 运算符使用引用或指针交换两个变量的值
- 在什么情况下,运算符=应该用左值/右值重载而不是复制和交换来实现
- 具有不变返回类型的模板类中的交换运算符
- 如何在赋值运算符中使用 noexcept 与复制和交换成语
- 在赋值移动运算符内部使用交换