0

我有一个结构向量,我需要有关如何根据其中一个值对它们进行排序的帮助,如果这两个值相同,则根据另一个参数对其进行排序。

这与其他问题类似,但有更多问题。

我要实现的是基于扫描线的多边形填充算法。

我构建了活动边列表,但随后我需要根据每个结构对象中的 x 值对其进行排序。如果 x 值相同,则需要根据每个结构对象的斜率的倒数对它们进行排序。

这是具有覆盖运算符 < 的结构定义,用于正常排序:

struct Bucket
{
    // Fields of a bucket list
    int ymax, x, dx, dy, sum;

    // Override the < operator, used for sorting based on the x value
    bool operator < (const Bucket& var) const
    {
        // Check if the x values are the same, if so
        // sort based on the ivnerse of the slope (dx/dy)
        /*if(x == var.x)
            return (dx/dy) < (var.dx/var.dy);
        else*/
            return (x < var.x);
    }
};

我注释掉了 if then else 语句,因为它确实可以编译,但会导致浮点错误并且程序崩溃。确切的错误是:“浮点异常(核心转储)”

我还尝试将每个部门转换为 (int) 但这也不起作用。

我的问题:有没有办法进行类似于我的排序,或者我应该编写自己的排序方法。

如果我应该制作自己的排序方法,请提供一个链接或一些可以提供帮助的简单方法。

谢谢

4

2 回答 2

3

您应该实现双除法,因为对于整数,例如,当您有 5/6 时,它会导致 0,而我们知道,除以 0 是不可能的。这就是程序崩溃的原因。所以将结构的成员更改为双精度。然后你应该注意一些精度问题,但至少假设你不允许 dy 的值为 0,程序不会崩溃。

于 2012-09-28T19:00:10.023 回答
1

您可以使用覆盖不同运算符的元组进行字典比较( http://en.cppreference.com/w/cpp/utility/tuple/operator_cmp

typedef std::tuple<int, int, int, int, int> Bucket;

但是将结构更改为元组有点烦人。您可以使用tie为您制作元组。

bool operator < (const Bucket& var) const
{
    std::tie(x, dx/dy) < std::tie(var.x, var.dx/var.dy);
}

但是,此解决方案无法编译,因为它适用于引用。

bool operator < (const Bucket& var) const
{
    int slope = dx/dy;
    int var_slope = var.dx/var.dy;  
    std::tie(x, slope) < std::tie(var.x, var_slope);
}

这不是最有效的解决方案,但可读性相当好。当然,在这个例子中你仍然需要除以 0。

于 2014-02-20T11:23:25.520 回答