使用模板实现排序。如何使用比较器?

时间:2013-12-01 11:44:41

标签: c++ templates sorting compiler-errors

我正在实现一个简单的排序算法,只是为了了解C ++模板的工作原理。 我需要使用不同类型的元素对数组进行排序,因此我需要使用不同的函数来比较它们。例如,我想通过他们的效率对足球运动员阵列进行排序。我用结构编写了仿函数并以这种方式使用它:

 insertionSort(players, 0, players.size() - 1, Player());

但是在insertSort中我需要将比较器 c 传递给另一个函数:

 less(input[j], input[j-1], c); // can I do so?

这是我的代码:

struct Player
{
    int number;
    ulong efficiency;

    Player(int numb, ulong ef) : number(numb), efficiency(ef) {}
    Player() : number(0), efficiency(0) {}

    // functor for comparing players by efficiency 
    bool operator() (const Player &left, const Player &right)
    {
        return left.efficiency < right.efficiency;
    }
};

// template function for comparing various elements
template<typename T, typename Comp = std::less<T> >
bool less (const T &left, const T &right, Comp c = Comp())
{
    return c(left, right);
}

template <typename T>
void swap (T &a, T &b)
{
    T tempr = a;
    a = b;
    b = tempr;
}

template<typename T, typename Comp = std::less<T> >
void insertionSort (vector<T>& input, int begin, int end, Comp c = Comp())
{
    for (int i = begin; i <= end; ++i)
        for (int j = i; j > begin && less(input[j], input[j-1], c); --j)
            swap(input[j], input[j-1]);   
}

现在我有以下编译错误:“默认模板参数只允许在函数 less 中使用类模板”和另一个模板函数。拜托,请问,我做错了什么?我无法找出我的错误在哪里。谢谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可能正在编译C ++ 03模式,并且不允许在那里使用函数的默认模板参数。有关详细信息,请参阅this SO question。因此,如果您需要默认模板参数,则可以切换到C ++ 11或使用函子而不是函数。

使用类Player作为比较器可以工作,但每次调用insertionSort时都必须实例化它,因为类不为空,所以不是免费的。{1}}。使用单独的仿函数来比较玩家似乎更有效。

此外,您无需在less中调用insertionSort方法,直接调用比较器就足够了。 (c(input[j], input[j-1]))。

另一种解决方案是专门化std::less<Player>并始终使用std::less进行比较。请refer to this SO question

答案 1 :(得分:0)

我收回clang的消息非常清楚。

“函数模板的默认模板参数是C ++ 11扩展。”

这是C ++ 98中缺少的一个功能,后来在C ++ 11中添加了它。