【问题标题】:c++ vector iterator to function templatec++ 向量迭代器到函数模板
【发布时间】:2013-03-13 12:59:18
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      它不能从这些参数中推断出模板参数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) );
      

      【讨论】:

      • +1(我希望我能再次为此 +1 以节省时间来逐字逐句地写下我将要着手的内容)。老实说,如果做得足够简洁,他甚至不需要“知道”类型。示例可以是found here
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      • 2016-02-18
      相关资源
      最近更新 更多