如何在 C++ 中使用模板对不同类型的列表进行排序

How to sort diferent type of lists with template in C++

在我的家庭作业中,我的任务是为这些创建 FooCl class:

    double d[] = {1.3, 0.7, 2.4, 1.5, 6.2, 5.7, 8.6, 9.1};
    FooCl<double> itemsD(d, sizeof(d) / sizeof(d[0]));

    std::string s[] = {"C++", "Haskell", "Python", "Java"};
    FooCl<std::string> itemsS(s, sizeof(s) / sizeof(s[0]));

    itemsD.mySort();
    itemsS.mySort();

我为它做了一个 constructor/destructor,但我不知道如何使用模板为两种不同类型的列表创建两个不同的函数。 我想我需要使用某种重载但不知道如何。

template <typename T>
class FooCl
{
private:
    T *mItems;
    int mItemsSize;

public:
    FooCl(T items[], int itemsSize)
    {
        mItems = new T[itemsSize];
        for (int i=0; i<itemsSize; ++i)
        {
            this->mItems[i] = items[i];
        }
        this->mItemsSize = itemsSize;
    };

    ~FooCl()
    {
        delete[] mItems;
    }

    void mySort()
    {
        //I have no idea how to write this function, so it can sort two different types of lists.
    }
};

一种方法是使用 std::sort,如下所示:

void mySort()
{
//--vvvvvvvvv------------------------------------>use std::sort
    std::sort(mItems, mItems + mItemsSize);
}

您甚至可以编写自己的排序 functionality/implementation,其中将包括 mItemsmItemsSize 的使用。

排序的两个重要操作是比较和交换。

doublestd::string 都已经有了 < 的定义,这是惯用的比较运算符。

已经有一个模板std::swap,这是惯用的交换功能。

您需要编写一个使用 mItemsmItemsSize 的排序,比较项目(使用 <)并交换位置错误的项目(使用 std::swap).

如果您想对任何容器进行排序,例如 std::arraystd::vector

template <typename Container, typename Func>
void sort(Container& c, Func functor)
{
    std::sort(std::begin(c), std::end(c), functor);
}

用法

std::vector<int> vct {1,2,3,1,2};
sort(vct, [](const int lhs, const int rhs) {return lhs > rhs;});