比较不起作用的对的函数

时间:2015-01-15 21:34:20

标签: c++ vector stl std-pair

我编写了自己的比较函数来对对象的矢量进行排序。我的排序功能应该是这样的。 如果点(i,j)更接近(5,5),则点(i,j)将在点(x,y)之前,反之亦然。我找到了距离,然后根据它进行比较。       代码是

  #include<iostream>
  #include<stdlib.h>
  #include<cstdio>
  #include<vector>
  #include<algorithm>

  using namespace std;

  double distance(int a, int b,  int x, int y)
  {
     return sqrt(pow(a-x,2.0)+pow(b-y,2.0));
  }
  bool mycomp(const pair<int, int >&i, const pair<int, int >&j)
  {
    double dis=distance(i.first, i.second, 5,5);
    double dis2=distance(j.first, j.second, 5, 5);
    if(dis<dis2)
       return i.first< j.first;
    return i.first>j.first;
 }

 int main()
 {
    int n;
    cin>>n;
    vector<pair<int, int> > p;
    for(int i=0; i < n; i++)
    {
        int a,b;
        cin>>a >>b;
        p.push_back(make_pair(a,b));
    }
    sort(p.begin(),p.end(),mycomp);
    for(int i=0; i<n; i++)
        cout<<p[i].first<<" "<<p[i].second<<endl;
    return 0;
}

3 个答案:

答案 0 :(得分:0)

你没有指明你的意思是“不工作”,所以我会把它作为许可证,指出我喜欢你的代码。

您的mycomp例程不符合您的描述。特别是,始终确保比较例程是反对称的。

bool mycomp(const pair<int, int >&i, const pair<int, int >&j)
{
  double dis=distance(i.first, i.second, 5, 5);
  double dis2=distance(j.first, j.second, 5, 5);
  if (dis < dis2) {
    return true;
  }
  if (dis2 > dis) {
    return false;
  }
  // tie break
  return std::less<decltype(i)>(i,j);
}

如果使用decltype的那一行不起作用,您可能需要自己拼出打结。

答案 1 :(得分:0)

@ChristopherCreutzig的答案应该可以解决你的问题。我将建议一些可以消除计算平方根的需要。

   int square(int a)
   {
      return a*a;
   }

   int distanceSquared(int a, int b,  int x, int y)
   {
      return square(a-x) + square(b-y);
   }

   bool mycomp(const pair<int, int >&i, const pair<int, int >&j)
   {
     double dis1 = distanceSquared(i.first, i.second, 5, 5);
     double dis2 = distanceSquared(j.first, j.second, 5, 5);
     if ( dis1 != dis2 )
        return (dis1 < dis2);

     return (i.first < j.first);
  }

答案 2 :(得分:-1)

这不是正确的条件检查。 if(dis<dis2) return i.first< j.first return i.first>j.first;

应该足够return dis < dis2;