没有匹配函数调用选择排序函数与模板(c++)
no matching function call for selection sort function with templates(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)移动您的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循环,而iter_swap
等于你自己的交换。使用STL算法的优点是它们更有可能是正确的(手写代码中差1的错误非常常见)
PS:您可以类似地使用std::upper_bound
和std::rotate
(读者练习)在2行中编写insertion_sort算法
问题是typename T
似乎不被使用,不能由编译器推断。您必须显式地指定类型:
selection_sort<vector<int>::iterator, int>(v.begin(),v.end());
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗