1

我是 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 风格。

4

2 回答 2

3

它不能T从这些参数中推断出模板参数。事实上,你甚至不需要T. 这是多余的,因为您可以计算出Tfrom的类型Iter——毕竟,迭代器会迭代 type 的元素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) );
于 2013-03-23T19:39:28.097 回答
0

您需要在VectorQuickSort<int,/*iterator type*/>(vInput.begin(),vInput.end());上面编写或任何您希望模板化的内容,请注意您提到它是在 T 上模板化的,但是该函数无法推断 T 模板化的位置/方式...删除 T 并使用 auto 或告诉函数T是如何模板化的

于 2013-03-23T19:38:14.213 回答