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。実際、必要さえありませんTTfromの型を計算できるため冗長です。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 はどのようにテンプレート化されていますか

于 2013-03-23T19:38:14.213 に答える