c ++向量函数模板的向量迭代器

时间:2013-03-23 19:36:24

标签: c++ vector stl iterator parameter-passing

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

2 个答案:

答案 0 :(得分:3)

它无法从这些参数中推导出模板参数T。实际上,您甚至不需要T。这是多余的,因为您可以从T计算出Iter的类型 - 毕竟,迭代器会迭代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) );

答案 1 :(得分:0)

你需要写VectorQuickSort<int,/*iterator type*/>(vInput.begin(),vInput.end());或者你想要的任何你想要的模板,注意你提到它的模板超过T但是函数没有办法推断T的模板在哪里/如何... 删除T并使用auto或告诉函数T templated是什么