所以我为自己制作了一个点打印类,它应该让用户输入2元组;也就是说,x和y,然后按^顺序将它们打印回用户,^其中顺序表示p1 =(x,y)
#include <iostream>
#include <vector>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;
class Point2D {
public:
Point2D();
Point2D(double a, double b);
double getx();
double gety();
void setx(double a);
void sety(double b);
virtual void print();
virtual void print(int a);
double angle();
private:
double x;
double y;
};
bool operator<( Point2D a , Point2D b );
int main() {
double my_x=-999;
double my_y=-999;
string my_color;
double my_weight;
vector<Point2D*> points;
cout << "Welcome to Point Printer! Please insert the x-and y-coordinates for your points and I will print them in sorted order! Just one rule, the point (0,0) is reserved as the terminating point, so when you are done enter (0,0).\n";
while(true)
{
cout << "x = ";
cin>>my_x;
cout << "y = ";
cin>>my_y;
if((my_x == 0)&&(my_y==0))
{
break;
}
points.push_back(new Point2D(my_x, my_y));
}
sort(points.begin(), points.end());
cout << "\n\n";
cout << "Your points are\n\n";
for(int i=0;i<points.size();i++)
{
cout<<i+1<<": ";
(*points[i]).print(); cout<<endl; // this is the printing gadget
}
for(int i=0; i<points.size(); i++)
{
delete points[i];
}
cout << endl << endl;
return 0;
}
double Point2D::angle()
{
double Angle = atan2(y,x);
if(Angle < 0)
{
return Angle + 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679;
}
return Angle;
}
bool operator< (Point2D a, Point2D b)
{
if (a.getx()*a.getx()+a.gety()*a.gety() < b.getx()*b.getx()+b.gety()*b.gety())
{
return true;
}
else if (a.getx()*a.getx()+a.gety()*a.gety() > b.getx()*b.getx()+b.gety()*b.gety())
{
return false;
}
if (a.getx()*a.getx()+a.gety()*a.gety() ==b.getx()*b.getx()+b.gety()*b.gety())
{
if (a.angle() < b.angle())
{
return true;
}
else if (a.angle() > b.angle())
{
return false;
}
}
return true;
}
Point2D::Point2D() { x = 0; y = 0; return;}
Point2D::Point2D(double a, double b) { x = a; y = b; return;}
double Point2D::getx() { return x;}
double Point2D::gety() { return y;}
void Point2D::setx(double a) { x = a; return; }
void Point2D::sety(double b) { y = b; return; }
void Point2D::print() {
cout<<"("<<x<<","<<y<<")";
return;
}
void Point2D::print(int a) {
print(); cout<<endl;
}
我遇到的问题是以下任何一种情况:
排序
角(°)
运算符&lt;(Point2D a,Point2D b)
完全不同的东西......
特别是,以下几点:
x = 1
y = 2
x = 2
y = 3
x = 1.1
y = 2.2
x = -10
y = 10
x = -5
y = -3
x = -5
y = 3
x = 5
y = -3
x = 5
y = 3
x = 0
y = 0
未按正确顺序排序。
非常感谢任何帮助。谢谢。
答案 0 :(得分:0)
问题(或其中之一)是比较函数中的最终语句。
return true;
看看这个街区:
if (a.getx()*a.getx()+a.gety()*a.gety() ==b.getx()*b.getx()+b.gety()*b.gety())
{
if (a.angle() < b.angle())
{
return true;
}
else if (a.angle() > b.angle())
{
return false;
}
}
首先,如果我们已经达到这一点,我们已经确定(x*x + y*y)
和a
的{{1}}计算是相等的。现在让我们假设角度也相等。怎么了?第一次测试失败,因为b
不小于a.angle()
。然后第二次测试失败,因为b.angle()
不大于a.angle()
。然后你返回true。换句话说,你说b.angle()
小于a
是正确的,即使通过所有权利,它们也应该被认为是相等的,所以你应该返回false。您可以b
而不是对角度进行多次测试,而这应该可以解决问题。通过一些额外的简化,您的功能应该如下所示:
return a.angle() < b.angle();
答案 1 :(得分:0)
问题可能是您存储和排序指针,而不是对象。这些积分不会与您的运营商进行比较,而是与他们的地址进尝试将更改点更改为vector<Point2d>
答案 2 :(得分:0)
首先使用(如果您只是计划对2D点进行排序):
(编辑:请参阅下面的Benjamin Lindley评论。)
bool operator < ( Point2D a, Point2D b)
{
return a.getx() < b.getx() ||
(a.getx()==b.getx() && a.gety()< b.gety() );
}
如果在std::cout
中使用operator < ( Point2D a, Point2D b)
,则会发生另一件事,你会发现它不会随时被调用。
原因是:
vector<Point2D*> points; // Vector of Point2D*
但bool operator< (Point2D a, Point2D b)
用于比较。
建议的修正:
vector<Point2D> points;
points.push_back(Point2D(my_x, my_y));
因此,只要适用,
你也无法定义像
这样的东西 bool operator<(const Point2D* a, const Point2D* b)
因此:
C ++ 03标准,§13.5[over.oper] p6:
运算符函数应该是非静态成员函数或 是非成员函数,并且至少有一个类型为的参数 类,对类的引用,枚举或对引用的引用 枚举。