我编写了自己的比较函数来对对象的矢量进行排序。我的排序功能应该是这样的。 如果点(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;
}
答案 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;