2

我很难在这里理解其他人的代码。如果有人帮助我,我将不胜感激。

假设有一个 object 数组:vpair_list并且 thisvpair_list有一个 class 的类型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有两个不同的属性。

排序是否像比较每个属性(vidvlabel)或......?我认为排序应该通过比较特定字段或属性(vidvlabel此处)来完成。

但是这段代码与此无关,似乎只是比较了整个对象。有人可以告诉我这是如何工作的吗?

先感谢您。

4

3 回答 3

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);
    }

};
于 2013-01-04T00:58:17.797 回答
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);
于 2013-01-04T00:59:05.483 回答
0

排序是否像比较每个属性(vid 和 vlabel)或....?

完全按照您希望的方式发生。

默认情况下,正如人们所提到的,各种排序算法都使用运算符来按该运算符的升序<排列元素。然而,对于类/结构,没有默认方法来比较它们,这意味着程序员必须对其进行编码。

那是什么

bool operator < (const vpair& x, const vpair& y);

是。它只是对程序员提供的用于比较 2vpair顺序的函数定义的声明。程序员使用他的规则来决定并最终返回trueor 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 的升序排序。

于 2013-01-04T01:11:58.577 回答