2009-04-08 8 views
0

У меня есть следующий функтор переопределения меньше оператора метода сортировки для векторного типа:функции внутри определения функтора

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 и ay; Каждое ребро задается краем источника [0] и краем адреса [1], где edge [0], edge [1] являются индексами точек). Я хочу устроить ребро: - координатой x их ребра [0] координаты (если x из двух ребер различны) - координатой y их края [0] координаты (если x из 2 ребра равны) - по их соответствующим склонам (если х краев и у краев равны).

Я объявил функция getSLope статичны, но когда я сортировать края с

sort(myEdges_.begin(),myEdges_.end(),order()); 

последнее условие не fullfilled. если у меня есть два ребра с теми же x и y для edgep [0], но с разными склонами, например. наклон (edge1) = 1, наклон (edge2) = 1/2, чем я хотел бы получить [edge2, edge1]; вместо этого я получаю [edge1, edge2]. Итак, мои критерии getSlope не вычисляются.

Это потому, что я объявил getSlope статическим? что я должен изменить, чтобы критерии выполнялись? заблаговременно за ваши предложения, madalina

ответ

0

Возможно, это произошло потому, что результат выражения мог быть рассчитан без него.
т.д .:

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 
+0

Я думаю, что у меня есть ложное && SomeFunction() madalina

+0

проверьте это с помощью отладчика или печатной части уравнения. если да - someFunction() bayda

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]) 
+0

ДА! это был неверный индекс для edge2 [1]. Thanks.yepp выглядит довольно сложно. – madalina

+0

мое удовольствие. теперь дай мне точку, дай мне точку, :) – gbjbaanb

Смежные вопросы