[英]c++ vector iterator to function template
我是STL的新手。 我正在尝试编写一个以矢量迭代器为参数的例程。 也就是说,我需要传递vector.begin()和vector.end()。 无法理解我的代码无效的原因:
template<typename T, typename Iter> void VectorQuickSort(Iter itL, Iter itR){
const int nSize = (itR - itL);
if(nSize<2) return;
Iter iBeginning(itL), iEnd(itR);
--itR;
T tPivot = *( itL + (nSize/2) );
while( itL <= itR ){
while( *itL < tPivot ) ++itL;
while( *itR > tPivot ) --itR;
if( itL <= itR ){
std::iter_swap(itL,itR);
++itL;
--itR;
}
}
VectorQuickSort(iBeginning,itR);
VectorQuickSort(itL,iEnd);
}
在main()
我只需调用VectorQuickSort(vInput.begin(),vInput.end());
。 编译器告诉我error: no instance of function template "VectorQuickSort" matches the argument list
。 任何帮助赞赏:)
编辑:作为对可能尝试使用上述代码的人的警告:即使您应用了提供的答案,排序算法本身仍然存在问题。 我无法正确地将C版本转换为STL样式。
它不能从这些参数中推导出模板参数T
事实上,你甚至不需要T
它是多余的,因为你可以从Iter
出T
的类型 - 毕竟,迭代器迭代了T
类型的元素。 将其更改为:
template<typename Iter>
然后,如果您使用的是C ++ 11,则可以更改使用T
的行来自动推断tPivot
的类型:
auto tPivot = *( itL + (nSize/2) );
如果您没有C ++ 11支持,则可以使用std::iterator_traits
来确定适当的类型:
typename std::iterator_traits<Iter>::value_type tPivot = *( itL + (nSize/2) );
您可以使用typedef
简化此操作:
typedef typename std::iterator_traits<Iter>::value_type value_type;
value_type tPivot = *( itL + (nSize/2) );
您需要编写VectorQuickSort<int,/*iterator type*/>(vInput.begin(),vInput.end());
或者你想要它在上面模仿的任何东西,请注意你提到它的模板超过T但是该函数无法推断T的模板在哪里/如何...删除T并使用auto或告诉函数如何模板化
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.