【问题标题】:Sort algorithm which sorts objects by data inside using templates使用模板按内部数据对对象进行排序的排序算法
【发布时间】:2017-10-21 13:06:42
【问题描述】:

我有一个任务是创建一个使用模板的代码。

看起来,在我的代码中使用它们的最简单方法之一是实现一种排序算法,该算法根据存储在其中的不同值对对象数组进行排序。甚至可以实现这样的模板吗?这样做有意义吗?

我的班级应该是这样的:

class Data{
    private:
        int x;
        double y;
    public:
        void setX(int a){x = a;};
        void setY(double a){y = a;};
        int getX(){return x;};
        double getY(){return y;};
};

int main(){
    Data A[10];
    return 0;
}

我需要创建一个排序算法,可以通过Data::xData::y 对这个数组进行排序。算法的速度无所谓,可以是简单的冒泡排序。

【问题讨论】:

  • 你看过std::sort吗?它是模板化的,完全按照您的建议...

标签: c++ algorithm sorting templates


【解决方案1】:

编辑:既然我已经重新阅读(并编辑)了您的问题,您似乎已经委托自己实现std::sort 的重载之一的简化​​版本。请注意,如果您只需要以任何可能的方式使用模板,则制作类模板会容易得多。这个答案的其余部分写得好像你的教授明确要求你实现这样的排序算法。

我认为您的作业的重点是让您了解自定义比较函数(也称为谓词或比较器)在排序算法中的使用。您传入一个函数用于基于Data::x_ 进行比较,另一个用于基于Data::y_ 进行比较。

这是一个例子:

class Data
{
public:
    Data(int x, double y)
        : y_(y), x_(x)
    {}

    void setX(int x) { x_ = x; }
    void setY(double y) { y_ = y; }
    int getX() const { return x_; }
    double getY() const { return y_; }

private:
    double y_;
    int x_;
};

template <typename RandomIt_, typename Compare_>
void data_sort(RandomIt_ first, RandomIt_ last, Compare_ cmp)
{
    for (auto i = first; i != last; ++i)
        for (auto j = i+1; j != last; ++j)
            if (!cmp(*i, *j))
                std::swap(*i, *j);
}

void print_data(Data* d, size_t n)
{
    for (int i = 0; i < (int)n; i++)
        printf("Data: x: %d, y: %f\n", d[i].getX(), d[i].getY());
}

int main()
{
    Data a[5] = { Data(0, 4), Data(1, 3), Data(2, 2), Data(3, 1), Data(4, 0) };

    printf("Sorting based on ints:\n");
    data_sort(&a[0], &a[5], [](const Data& lhs, const Data& rhs) {
        return lhs.getX() < rhs.getX();
    });

    print_data(&a[0], 5);
    printf("\n");

    printf("Sorting based on doubles:\n");
    data_sort(&a[0], &a[5], [](const Data& lhs, const Data& rhs) {
        return lhs.getY() < rhs.getY();
    });

    print_data(&a[0], 5);
    return 0;

排序功能确实很垃圾,但你应该明白这一点。如果由于某种原因不允许使用 C++11,则可以手动定义函子,如下所示:

struct IntCompare
{
    bool operator()(const Data& lhs, const Data& rhs)
    {
        return lhs.getX() < rhs.getX();
    }
};

struct DoubleCompare
{
    bool operator()(const Data& lhs, const Data& rhs)
    {
        return lhs.getY() < rhs.getY();
    }
};

并像这样使用它们:

data_sort(&a[0], &a[5], IntCompare());
data_sort(&a[0], &a[5], DoubleCompare());

您还必须摆脱autos。

请注意,如果您在作业之外执行此操作,您可能应该使用std::sort,因为它的结构完全相同(除了更好的实现)。例如

 std::sort(&a[0], &a[5], IntCompare());
 std::sort(&a[0], &a[5], DoubleCompare());

例子的输出是:

Sorting based on ints:
Data: x: 0, y: 4.000000
Data: x: 1, y: 3.000000
Data: x: 2, y: 2.000000
Data: x: 3, y: 1.000000
Data: x: 4, y: 0.000000

Sorting based on doubles:
Data: x: 4, y: 0.000000
Data: x: 3, y: 1.000000
Data: x: 2, y: 2.000000
Data: x: 1, y: 3.000000
Data: x: 0, y: 4.000000

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多