我很难在这里了解其他人的代码。 如果有人帮助我,我真的很感激。
假设有一个对象数组:vpair_list
,此vpair_list
的类型为vpair
。所以,它会是这样的:
class vpair
{
public:
int vid;
int vlabel;
};
bool operator < (const vpair& x, const vpair& y);
vpair* vpair_list;
vpair_list = new vpair[25];
..
sort(vpair_list, vpair_list+j);
我所知道的是sort()
比较数组vpair_list
的每个元素并对它们进行排序。
问题是我无法理解排序是如何工作的,因为对象vpair
有两个不同的属性。
排序是否像比较每个属性(vid
和vlabel
)或....我认为排序应该通过比较特定字段或属性(此处为vid
或vlabel
)来完成。
但这段代码与此无关,似乎只是比较整个对象。有人能告诉我这是如何运作的吗?
提前谢谢。
答案 0 :(得分:2)
标准方法:
class vpair
{
public:
int vid;
int vlabel;
};
bool operator < (vpair const& x, vpair const& y)
{
return std::tie(x.vid, x.vlabel) < std::tie(y.vid, y.vlabel);
}
当然,运营商可以是会员:
class vpair
{
int vid;
int vlabel;
public:
bool operator < (vpair const& y) const
{
return std::tie(vid, vlabel) < std::tie(y.vid, y.vlabel);
}
};
答案 1 :(得分:1)
排序与operator<
进行比较。您可以为您的类实现此运算符,如下所示:
public:
bool operator < (const vpair& other) const
{
return (vid < other.vid); // Uses vid but this can be vlable or something else.
}
如果你所使用的类没有operator<
的重载,你总是可以将比较函数作为std::sort
的第三个参数传递:
bool compare_func(vpair i,vpair j) { return (i.vid < j.vid); }
sort(vpair_list, vpair_list+j, compare_func);
答案 2 :(得分:0)
排序是否像比较每个属性(vid和vlabel)或....
它会发生你想要的。
默认情况下,人们提到过,<
运算符被各种排序算法用于按该运算符的升序排列元素。但是对于类/结构,没有默认方式来比较它们意味着你是程序员必须对其进行编码。
这就是
bool operator < (const vpair& x, const vpair& y);
是。它只是对程序员提供的用于比较2 vpair
顺序的函数定义的声明。程序员使用他的规则来决定并最终返回true
或false
。这用于排序。
所以你可以决定你想要它的排序方式。
bool operator < (const vpair& x, const vpair& y)
{
if(x.vid != y.vid)
return x.vid<y.vid;
return x.vlabel <y.vlabel;
}
这将按ID的升序排序,如果它们相等,则按vlabel的升序排序。