其他分享
首页 > 其他分享> > 没有匹配的函数调用带有模板的选择排序函数(C)

没有匹配的函数调用带有模板的选择排序函数(C)

作者:互联网

我在玩模板,我想知道为什么使用模板时出现不匹配的函数错误.

/*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());
}

解决方法:

您有一个未推导的模板参数T,因此需要1)将类型名称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循环,而iter_swap等同于您自己的交换.使用STL算法的优点是它们更可能是正确的(手写代码中的一一错误很常见)

PS:您可以类似地使用std :: upper_bound和std :: rotate在2行中编写insert_sort算法(阅读器为exercise)

标签:template-deduction,c,sorting,templates,selection
来源: https://codeday.me/bug/20191011/1891669.html