编辑:既然我已经重新阅读(并编辑)了您的问题,您似乎已经委托自己实现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