排序结构的向量

时间:2012-09-28 18:51:49

标签: c++ sorting vector struct

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

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

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

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

这是使用override运算符<结构的定义。正常排序:

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),但这也不起作用。

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

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

由于

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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除法。