2

我正在玩模板,我想知道为什么使用模板会出现不匹配的功能错误。

/*selection sort*/
template <typename InputIterator, typename T>
void selection_sort(InputIterator first, InputIterator last){
    InputIterator min;
    for(; first != last - 1; ++first){
        min = first;

        for(T i = (first + 1); i != last ; ++i)
        {
            if(*first < *min)
                min = i;
        }
        myswap(*first, *min);
    }
}

int main(){
    int a[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
    vector<int> v(a, a+10);
    selection_sort(v.begin(),v.end());
}
4

2 回答 2

7

您有一个未推导出的模板参数 T,因此您需要 1)将您的模板参数移动typename T为第一个模板参数:

// now InputIterator will be deduced
template <typename T, typename InputIterator>
void selection_sort(InputIterator first, InputIterator last)
{
    // your implementation
}

和 2) 限定您的呼叫排序为selection_sort<int>(v.begin(), v.end());

顺便说一句,这里有一个更通用的选择排序实现,注意它只需要一个迭代器和比较函数作为模板参数,比较函数采用迭代器指向的值类型(这是 C++11 代码,因为默认函数模板参数,对于 C++98 编译器,您需要有 2 个重载,带或不带比较函数)

template< typename ForwardIterator, typename Compare = std::less<typename std::iterator_traits<ForwardIterator>::value_type> >
void selection_sort(ForwardIterator first, ForwardIterator last, Compare cmp = Compare())
{
        for (auto it = first; it != last; ++it) {
                auto const selection = std::min_element(it, last, cmp);
                std::iter_swap(selection, it);
        }
}

调用std::min_element等同于您的 for 循环,而 theiter_swap等同于您自己的交换。使用 STL 算法的优点是它们更可能是正确的(手写代码中的一个错误很常见)

std::upper_boundPS:您可以类似地使用和std::rotate(为读者练习)在 2 行中编写插入排序算法

于 2013-01-19T09:18:33.433 回答
3

问题是那些typename T似乎没有被使用的,不能被编译器推导出来。您必须明确指定类型:

selection_sort<vector<int>::iterator, int>(v.begin(),v.end());
于 2013-01-19T09:17:52.247 回答