我有以下仿函数来重新定义向量类型的sort方法的less运算符:
typedef vector< vector<int> > MxInt2d;
typedef vector< vector<double> > MxDouble2d;
class QSweep{
public:
....
static MxDouble2d myPoints_;
MxDouble2d myEdges_;
class order{
public:
bool operator() (const vector<int>& edge1, const vector<int>& edge2){
//std::cout<<"inside sort"<<endl;
//3 sort criteria
return (myPoints_[edge1[0]][0]<myPoints_[edge2[0]][0])||
(myPoints_[edge1[0]][0]==myPoints_[edge2[0]][0]&&
myPoints_[edge1[0]][1]<myPoints_[edge2[0]][1])
||
(myPoints_[edge1[0]][0]==myPoints_[edge2[0]][0]&&
myPoints_[edge1[0]][1]==myPoints_[edge2[0]][1]&&
getSlope(myPoints_[edge1[0]][0],myPoints_[edge1[0][1],
myPoints_[edge1[1]][0],myPoints_[edge1[1]][0])
<
getSlope(myPoints_[edge2[0][0],myPoints_[edge2[0][1],
myPoints_[edge2[1]][0],myPoints_[edge2[1]][0]));
}
};
static double getSlope(double a, double b, double c, double d);
};
其中getSlope是以下列方式定义的函数:
double QSweep::getSlope(double a, double b, double c, double d){
double slope=0.0;
//std::cout<<"slope criteria"<<endl;
double denum=c-a;
if (denum==0){
std::cout<<"zero denominator"<<endl;
}
else{
slope=(d-b)/denum;
}
return slope;
}
每个点由索引,x和y坐标给出;每个边由源边[0]和目标边[1]给出,其中边[0],边[1]是点的索引)。 我想安排边缘: - 通过其边[0]坐标的x坐标(如果2个边的x不同) - 通过它们的边[0]坐标的y坐标(如果2个边的x相等) - 通过它们相应的斜率(如果边缘的x和边缘的y相等)。
我声明了getSLope函数是静态的,但是当我用
对边进行排序时 sort(myEdges_.begin(),myEdges_.end(),order());
最后一个条件未满。 如果我有两个边缘具有相同的x和y用于edgep [0]但具有不同的斜率,例如斜率(edge1)= 1,斜率(edge2)= 1/2比我想要得到的 [edge2,edge1];相反,我得到[edge1,edge2]。 所以我的getSlope标准没有计算出来。
是因为我声明了getSlope静态吗?我应该改变什么才能达到标准? 提前感谢您的建议, madalina
答案 0 :(得分:1)
crikey!它看起来相当复杂,首先你尝试使用一组不太复杂的值进行计算 - 也就是说我看到你有cout语句,我相信它们在你运行它时能正常工作吗?
如果是这样,那么你对getSlope的输入是错误的 - 不应该
getSlope(myPoints_[edge2[0][0],myPoints_[edge2[0][1],
myPoints_[edge2[1]][0],myPoints_[edge2[1]][0])
是
getSlope(myPoints_[edge2[0][0],myPoints_[edge2[0][1],
myPoints_[edge2[1]][0],myPoints_[edge2[1]][1])
答案 1 :(得分:0)
也许它发生了,因为表达结果可以在没有它的情况下计算出来 E.g:
false && someFunction(); - function will not be called
true || someFunction(); - function will not be called
这是很好的规则,它允许我们写下:
if ( ptr && ptr->someMethod() )
// call method will not be called for NULL pointers