2013-03-23 96 views
1

我是新来的STL。我正在尝试编写一个以矢量迭代器为参数的例程。也就是说,我需要传递vector.begin()和vector.end()。想不通为什么我的代码不工作:C++向量迭代器函数模板

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样式。

回答

3

它不能从这些参数推导出模板参数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 typename std::iterator_traits<Iter>::value_type value_type; 
value_type tPivot = *(itL + (nSize/2)); 
+1

+1(并且我希望我可以再次+1这为我节省时间写出非常逐字逐句的我即将开始)。说实话,他甚至不需要“知道”这种类型,如果这足够简洁。示例可以[在这里找到](http://ideone.com/BNMEjg) – WhozCraig 2013-03-23 21:29:07

+0

@sftrabbit非常感谢! – 2013-03-23 23:28:11

0

你需要写VectorQuickSort<int,/*iterator type*/>(vInput.begin(),vInput.end());或任何你想它在上面模板化,注意你提到它的模板化T但功能无法推断T模板化的地方/如何... 删除T和使用自动或告诉函数T模板如何