C++ 对对象向量进行排序

C++ 对对象向量进行排序,c++,sorting,object,vector,C++,Sorting,Object,Vector,我有一个填充了一些顶点对象实例的向量,需要根据它的“x”和后面的“y”坐标对它进行排序 顶点h #ifndef VERTEX_H #define VERTEX_H 1 class Vertex { private: double __x; double __y; public: Vertex(const double x, const double y); bool operator<(const Vertex &b) const; double x(void

我有一个填充了一些顶点对象实例的向量,需要根据它的“x”和后面的“y”坐标对它进行排序

顶点h

#ifndef VERTEX_H
#define VERTEX_H 1

class Vertex
{
private:
  double __x;
  double __y;
public:
  Vertex(const double x, const double y);
  bool operator<(const Vertex &b) const;
  double x(void);
  double y(void);
};

#endif // VERTEX_H
但我真正得到的是:

Original:
Vertex (x: 0.00 y: 0.00)
Vertex (x: -3.00 y: 0.30)
Vertex (x: -3.00 y: -0.10)
Vertex (x: 3.30 y: 0.00)
Sorted:
Vertex (x: 0.00 y: 0.00)
Vertex (x: -3.00 y: -0.10)
Vertex (x: -3.00 y: 0.30)
Vertex (x: 3.30 y: 0.00)

我不知道到底出了什么问题,知道吗?

您将
顶点*
存储在容器中,而不是
顶点
。当您调用
std::sort
,实际上是对指针的值进行排序,而不是对项目本身进行排序

如果确实需要存储指针(我对此表示怀疑),则可以使用如下解决方法(未经测试):

struct less_than_key{
内联布尔运算符()(常数顶点*&v1,常数顶点*&v2){
返回((*v1)<(*v2));
}
};
排序(list.begin(),list.end(),less_than_key());

您将
顶点*
存储在容器中,而不是
顶点
。调用
std::sort
时,实际上是对指针的值进行排序,而不是对项目本身进行排序

如果确实需要存储指针(我对此表示怀疑),则可以使用如下解决方法(未经测试):

struct less_than_key{
内联布尔运算符()(常数顶点*&v1,常数顶点*&v2){
返回((*v1)<(*v2));
}
};
排序(list.begin(),list.end(),less_than_key());

出于某种原因,您似乎希望将值排序为单独的值:
试试这个:

bool Vertex::operator<(const Vertex &b) const
{
  return std::abs(__x) < std::abs(b.__x) || (std::abs(__x) == std::abs(b.__x) && std::abs(__y) < std::abs::(b.__y));
}
std::vector<Vertex> list;
list.push_back(Vertex(0, 0);
list.push_back(Vertex(-3, 0.3);
...

bool-Vertex::operator似乎出于某种原因,您希望排序为一个单独的值:
试试这个:

bool Vertex::operator<(const Vertex &b) const
{
  return std::abs(__x) < std::abs(b.__x) || (std::abs(__x) == std::abs(b.__x) && std::abs(__y) < std::abs::(b.__y));
}
std::vector<Vertex> list;
list.push_back(Vertex(0, 0);
list.push_back(Vertex(-3, 0.3);
...

bool Vertex::operator您正在对指针进行排序,而不是实际的顶点对象。试试这个:

bool Vertex::operator<(const Vertex &b) const
{
  return std::abs(__x) < std::abs(b.__x) || (std::abs(__x) == std::abs(b.__x) && std::abs(__y) < std::abs::(b.__y));
}
std::vector<Vertex> list;
list.push_back(Vertex(0, 0);
list.push_back(Vertex(-3, 0.3);
...
std::向量列表;
列表。向后推(顶点(0,0);
列表。向后推(顶点(-3,0.3);
...

例如,清除列表容器中的指针,并在调用中删除新的指针以向后推。\p>您正在排序指针,而不是实际的顶点对象。请尝试以下操作:

bool Vertex::operator<(const Vertex &b) const
{
  return std::abs(__x) < std::abs(b.__x) || (std::abs(__x) == std::abs(b.__x) && std::abs(__y) < std::abs::(b.__y));
}
std::vector<Vertex> list;
list.push_back(Vertex(0, 0);
list.push_back(Vertex(-3, 0.3);
...
std::向量列表;
列表。向后推(顶点(0,0);
列表。向后推(顶点(-3,0.3);
...

即删除列表容器中的指针,并在调用PaseSubEnter中调用新的.< /P> < P>如果您想自己保存所有这些类(并且违反双下划线规则),可以考虑仅使用

std::vector< std::pair<float, float> >
std::vector

<>和使用<代码> STD::排序。默认情况下,对是按字典方式比较的(这是你所要求的),所以你不需要任何额外的代码。

< P>如果你想自己保存所有这些类(并且违反双下划线规则),你可以考虑只使用一个

std::vector< std::pair<float, float> >
std::vector

并使用
std::sort
。默认情况下,对是按字典顺序比较的(这是您要求的),因此您不需要任何额外的代码。

如何编译?您的操作<采用常量和顶点,但没有
双顶点::x()const
?请阅读以下内容:请允许我欢迎您来到StackOverflow,并提醒我们在这里通常会做的三件事:1)当您收到帮助时,尝试给予帮助,回答您专业领域的问题2)3)当你看到好的Q&A时,投票给他们,因为系统的可信度是基于用户通过分享他们的知识而获得的声誉。还记得接受更好地解决你的问题的答案,如果有的话,那是如何编译的?你的operate<采用常量和顶点,但没有
double Vertex::x()const
?阅读以下内容:请允许我欢迎您来到StackOverflow,并提醒我们在这里通常会做的三件事:1)当您收到帮助时,尝试给予帮助,回答您专业领域的问题2)3)当您看到好的问答时,请通过,因为系统的可信度是基于用户通过分享知识而获得的声誉。还记得接受更好地解决你的问题的答案,如果有的话,@Wanderson那么你是如何解决这个问题的呢?您已将std::vector更改为std::vector或其他内容?添加了一个编辑来修复它,而无需将指针更改为非指针。我没有尝试编译,所以如果我犯了任何错误,请告诉我,以便我可以编辑。@Wanderson那么您是如何解决问题的?您已将std::vector更改为std::vector或其他内容?添加了一个编辑来修复它,而无需将指针更改为非指针。我没有尝试编译,所以如果我犯了任何错误,请告诉我,以便我可以编辑。我知道我可以使用std::pair,但它是Vertex类的简化版本,完整的版本有用于角度、距离和其他我需要的计算的方法。关于双下划线规则,我会确保在我未来的代码中应用它。@Wanderson:这很公平。如果你不能通过自由函数来进行这些转换和计算,那么你必须创建自己的类(尽管它可以将pair vector作为主要数据成员并公开其比较运算符)。我知道我可以使用std::pair,但它是Vertex类的简化版本,完整的类有角度的方法,距离和其他我需要的计算。关于双下划线规则,我会确保在我未来的代码中应用它。@Wanderson:这很公平。如果您无法使用自由函数进行这些转换和计算,那么您必须创建自己的类(尽管它可以将pair vector作为其主要数据成员并公开其比较运算符)。实际上,我需要列表开头最左边的顶点。然后,它不能是绝对值。实际上,我需要列表开头最左边的顶点。那么,它不可能是绝对值。